Questão Existe uma maneira de um arquivo de configuração SSH incluir outro?


Caso seja importante:

  • SO: Ubuntu 10.04
  • SSH: OpenSSH_5.3p1 Debian-3ubuntu5

Eu gostaria que um arquivo de configuração SSH incluísse outro. O caso de uso seria definir o que eu quiser no meu padrão .ssh/config arquivo e, em seguida, pré-pendurar um par de coisas extras em um arquivo separado (por exemplo, ~/.ssh/foo.config). Eu quero que o segundo arquivo incorpore o primeiro, então eu não tenho que duplicar tudo no primeiro. Isso é factível? Obrigado!


109


origem


Mesma pergunta no serverfault: serverfault.com/questions/375525/… - guettli


Respostas:


De 7.3p1 e acima, há o Include palavra chave que permite incluir arquivos de configuração.

Include

      Inclua o (s) arquivo (s) de configuração especificado (s).   Vários nomes de caminho podem ser especificados e cada nome de caminho   pode conter wildcards glob (3) e,   para configurações de usuário, referências “~” semelhantes a shell para o usuário inicial   diretórios. Arquivos sem caminhos absolutos são   assumido estar em ~/.ssh se incluído em um arquivo de configuração do usuário   ou /etc/ssh se incluído a partir do   arquivo de configuração do sistema. Include directiva pode   aparecem dentro de um Match ou Host quadra   para realizar a inclusão condicional.
Fonte: ssh_config (5).

Por exemplo, você poderia ter em ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

e em ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

Nos comentários, use o abaixo para incluir todos os arquivos no config.d diretório:

Include config.d/* 

96



verifique a versão com $ ssh -V - Pieter
Usar Include config.d/* para incluir todas as entradas em config.d. - Simon Woodside
Ftr: isso tem que ir no topo do arquivo e não pode simplesmente ser anexado à lista de Host entradas. - dtk
tentei no Ubuntu 16.04. No entanto, funciona, mas o o preenchimento automático está quebrado o que torna menos útil. Se você quiser atualizar o ssh no Ubuntu, verifique este link gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677 - cwhsu


Não, no meu conhecimento isso não é possível.

Aqui estão os links para solicitações de recursos abertos / tickets de bug correspondentes:

https://bugzilla.mindrot.org/show_bug.cgi?id=1585

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495


28



Também este bug no Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189 - Lluís
AMD. Está a acontecer. A partir de 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3 - oschrenk


Se você quer iniciar um cliente ssh, você pode fazer isso no bash:

#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'

então você usa o ssh normalmente e ele terá ambos os arquivos lidos nessa ordem.

Para o daemon do servidor sshd você poderia fazer o mesmo, apenas usar -f ao invés de -F e escreva isto onde você inicia o daemon diretamente. você não precisa de um alias.

Uma segunda possibilidade, de acordo com a página man, é colocar a configuração do sistema /etc/ssh/ssh_config e o usuário um em ~/.ssh/config.

Atualizar Aparentemente, há algum problema com algumas versões bash e como os dispositivos são criados. (Vejo http://bugs.alpinelinux.org/issues/1465)

Esta é uma solução alternativa (embora na minha opinião feia):

mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & 
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo

então se você quiser, você pode criar uma função dele (ou um script):

ssh() {
    tmp_fifo=$(mktemp -u --suffix=_ssh_fifo)
    mkfifo "$tmp_fifo" 
    cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null & 
    /usr/bin/ssh -F "$tmp_fifo" "$@"
    rm "$tmp_fifo"
}

24



Infelizmente isso não funciona no ssh do OSX: Não é possível abrir o arquivo de configuração do usuário / dev / fd / 63: Bad file descriptor - Ash Berlin-Taylor
Também não funciona para mim (Ubuntu 11.10) Linux dando o mesmo erro que @AshBerlin postado acima. - Szymon Jeż
@AshBerlin você pode tentar também, isso deve funcionar também para o OSX, até que o bug seja consertado - estani
Dado ssh verifica três lugares, 1. linha de comando, 2. ~/.ssh/config3 /etc/ssh/ssh_configvocê não precisa passar ~/.ssh/config na linha de comando também. Somente alias ssh='ssh -F ~/.ssh/foo.config' e ~/.ssh/config deve ser pego depois disso. Contanto que você não se importe foo.config sendo carregado primeiro que deve ser mais limpo do que a solução alternativa acima. - jim
@jim não, não funciona assim. O primeiro encontrado é usado. Tentaste? da página man "-F configfile: Especifica um alternativa arquivo de configuração por usuário. Se um arquivo de configuração for fornecido na linha de comando, o arquivo de configuração do sistema (/ etc / ssh / ssh_config) será ignorado. " - estani


Começando com ssh 7.3 (lançado em 1 de agosto de 2016), um Include diretiva está disponível.

Incluir: Inclua o (s) arquivo (s) de configuração especificado (s). Caminho múltiplo   nomes podem ser especificados e cada nome de caminho pode conter glob   curingas e referências "~" semelhantes a shell para os diretórios iniciais do usuário.   Os arquivos sem caminhos absolutos são considerados como ~/.ssh. A    Include directiva pode aparecer dentro de um Match ou Host bloco para   realizar inclusão condicional.

(Aqui está o link para o relatório de bug resolvido, que também inclui o patch: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24)


15





Similarmente ao outro 'feio' aqui está o meu one-liner:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"

14



Observe que sftp comando não acionará o recálculo de configuração. - VasyaNovikov
(Eu ainda gosto da resposta porque usa "config.d /" e é muito simples.) - VasyaNovikov
Simples, elegante, mas hacky - code_monk


Bem, eu meio que trapaceio para fazer isso. Nos meus arquivos bash .profile-ish eu tenho um bloco que substitui várias partes do meu diretório home no login, então eu apenas gero um novo a cada vez. Exemplo:

rm ~/.ssh/config
cat ~/conf/myservers.sshconfig >> ~/.ssh/config

[ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config
(or something like this:)
for i in `ls ~/conf/sshconfigs` ; do
    cat $i >> ~/.ssh/config
done

chmod 600 ~/.ssh/config

Isso também me permite fazer coisas como adicionar blocos de configuração ao arquivo de configuração ssh somente se eu estiver no host A ou B, mas não nos meus sistemas domésticos.

Agora eu sei, alguém vai se queixar que se você logar muito isso pode causar uma desaceleração excessiva, mas na prática eu nunca notei isso. E eu tenho certeza que você poderia colocar isso em um script e disparar via cron também.


6





Eu pessoalmente uso esses comandos para compilar a configuração do ssh:

alias compile-ssh-config='echo -n > ~/.ssh/config && cat ~/.ssh/*.config > ~/.ssh/config'
alias ssh='compile-ssh-config && ssh'
# (This will get used by other programs depending on the ~/.ssh/config)
# (If you need you can run the compile-ssh-config command via cron etc.)

ou:

alias compile-ssh-config='echo -n > ~/.ssh/config-compilation && cat ~/.ssh/*.config > ~/.ssh/config-compilation'
alias ssh='compile-ssh-config && ssh -F ~/.ssh/config-compilation'
# (This is saver and won't over write an existing ~/.ssh/config file)

Porque:

alias ssh='ssh -F <(cat .ssh/*.config)'

não funciona para mim, retornando:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor

Espero que isso seja de alguma ajuda.


3



Você poderia dar um passo adiante e combinar isso com o fswatch, para compilação automatizada na troca de arquivos - cavalcade


Outra solução baseada em FUSE (não testada):

https://github.com/markhellewell/sshconfigfs

"Em vez de ter que continuar gerenciando um grande arquivo, [...] em vez disso, construa um" arquivo "de configuração dinamicamente a partir de muitos fragmentos lógicos menores."

Eu também encontrei um artigo fazendo isso via FIFOs: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


3



Isto parece-me ser pouco mais que um link para um site externo portanto, pode ser removido. (Porque os links podem "morrer" e é útil, pelo menos, resumir o conteúdo de outro lugar para que as pessoas não sejam obrigadas a visitar o outro site para nenhum detalhe.) - pnuts
Eu acho que o conteúdo do comentário é descritivo o suficiente - ele diz "FUSE" (Talvez expandir o acrônimo seja melhor); O link é apenas para uma implementação. - aviv
FUSÍVEL. @aviv Bem, a resposta ainda não foi removida, por isso espero que nenhum dano seja feito! - pnuts
Não estava ciente do problema de respostas curtas, resposta expandida. Parece que vou ter que verificar o site para as minhas respostas de tempos em tempos, na ausência de notificações por e-mail :) Aprendi a usar favs, por agora. Obrigado pelos comentários. - amontero