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

118

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 não tenho que duplicar tudo no primeiro. Isso é factível? Obrigado!

Joe Casadonte
fonte
2
Mesma pergunta no serverfault: serverfault.com/questions/375525/…
guettli

Respostas:

117

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/* 
Osaka
fonte
12
verifique a versão com $ ssh -V
Pieter
5
Usar Include config.d/* para incluir todas as entradas em config.d.
Simon Woodside
10
Ftr: isso tem que ir no topo do arquivo e não pode simplesmente ser anexado à lista de Host entradas.
dtk
2
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, confira este link gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu
28

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

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

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

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

rems
fonte
2
Também este bug no Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís
8
AMD. Está acontecendo. A partir de 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk
Essa resposta estava correta na época, mas está desatualizada agora.
Mark Stosberg
24

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"
}
estani
fonte
1
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
1
@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
16

Começando com o 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 aos diretórios home dos usuários.   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 )

Christian Hudon
fonte
14

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

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
Aleksandr Makov
fonte
Observe que sftp comando não acionará o recálculo de configuração.
VasyaNovikov
2
(Eu ainda gosto da resposta porque usa "config.d /" e é muito simples.)
VasyaNovikov
2
Simples, elegante, mas hacky
code_monk
6

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 reclamar que se você logar muito isso pode causar lentidã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.

Dave
fonte
3

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.

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

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/

amontero
fonte
1
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
1
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
1
Não estava ciente do problema de respostas curtas, resposta expandida. Parece que vou ter que verificar o site para as minhas respostas de vez em quando, na ausência de notificações por e-mail :) Aprendi a usar favs, por agora. Obrigado pelos comentários.
amontero
2

Nenhuma dessas soluções de alias funciona para git ou outros programas que não sejam ssh.

Eu bati um rápido e sujo, mas você pode querer melhorar isso.

Adicione isto ao seu ~/.bashrc

mkdir -p ~/.ssh/config.d/
[ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins)
cat ~/.ssh/config.d/* > ~/.ssh/config

Cada vez que você inicia uma sessão, ela mesclará todos os arquivos ~/.ssh/config.d. (linha 3)

A desvantagem desta versão é que, se você mudar ~/.ssh/config Na próxima sessão que você abrir, suas alterações serão perdidas, para evitar que eu mova o arquivo existente para um arquivo .bak. (linha 2) O problema é que você vai ter um monte de arquivos .bak depois de um tempo.

Dean Rather
fonte
Excelente com adição de alguns is_anything_changed condição
vp_arth
1

Você pode facilmente atualizar a versão SSH no Ubuntu para v7.3 (testado no Ubuntu Xenial 16.04) instalando pacotes da Yakkety:

echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list
apt-get update
apt-get install -y ssh
rm /etc/apt/sources.list.d/yakkety.list
apt-get update

Verifique a versão do SSH

ssh -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016

Configurar o SSH para usar inclusões do diretório ~ / .ssh / config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config
panticz.de
fonte
0

Minha resposta idiota:

  • Tentei instalar o OpenSSH & gt; 7,3 no Xenial (16,04)
  • Não gostou da bagunça que fez

Então eu me decidi por isso:

  • Mantenha seus arquivos de configuração OpenSSH separados ~/.ssh/config.d/
  • Quando você muda um, faça cat ~/.ssh/config.d/* > ~/.ssh/config
  • No glorioso dia em que você atualizar para uma versão de distribuição que tenha o OpenSSH 7.3p1 ou mais recente, você pode criar um arquivo que contenha

Include config.d/*

Adrian
fonte
0

Eu não posso atualizar o SSH na minha máquina também.

Eu usei o GNU make para gerar o arquivo de configuração ssh somente quando necessário :

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)

Então ssh é aliado para

alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'

Ele funciona como um encanto.

gmathio
fonte