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

115

Caso seja importante:

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

Gostaria que um arquivo de configuração SSH incluísse outro. O caso de uso seria definir o que eu quiser no arquivo .ssh/config padrão e, em seguida, pré-pendurar algumas 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!

    
por Joe Casadonte 18.02.2011 / 18:45

12 respostas

109

A partir de 7.3p1, existe a palavra-chave Include , que permite incluir arquivos de configuração.

Include

    Include the specified configuration file(s).  Multiple pathnames may be specified and each pathname may contain glob(3) wildcards and, for user configurations, shell-like “~” references to user home directories.  Files without absolute paths are assumed to be in ~/.ssh if included in a user configuration file or /etc/ssh if included from the system configuration file.  Include directive may appear inside a Match or Host block to perform conditional inclusion.
Source: 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 diretório config.d :

Include config.d/* 
    
por 05.11.2016 / 21:12
29

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:

link

link

    
por 18.02.2011 / 18:54
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 os dois arquivos serão lidos nessa ordem.

Para o daemon do servidor sshd você poderia fazer o mesmo, apenas use -f em vez de -F e anote isto onde você inicia o daemon diretamente. você não precisa de um alias.

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

Update Aparentemente, há algum problema com algumas versões bash e como os dispositivos são criados. (veja link )

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"
}
    
por 19.04.2012 / 12:51
16

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

Include: Include the specified configuration file(s). Multiple path names may be specified and each pathname may contain glob wildcards and shell-like "~" references to user home directories. Files without absolute paths are assumed to be in ~/.ssh. An Include directive may appear inside a Match or Host block to perform conditional inclusion.

(Aqui está o link para o relatório de bug resolvido, que também inclui o patch: link )

    
por 11.07.2016 / 17:22
14

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

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
    
por 21.02.2013 / 10:02
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 se queixar 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.

    
por 20.11.2012 / 20:26
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.

    
por 27.11.2012 / 16:14
3

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

link

"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: link

    
por 10.06.2013 / 19:54
2

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

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

Adicione isso 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

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

A desvantagem dessa versão é que, se você alterar ~/.ssh/config da próxima sessão, as 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.

    
por 19.05.2015 / 11:45
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 SSH

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

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

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config
    
por 21.03.2017 / 14:57
0

Minha resposta idiota:

  • Tentou instalar o OpenSSH > 7,3 no Xenial (16,04)
  • Não gostou da bagunça que fez

Então eu decidi por isso:

  • Mantenha seus arquivos de configuração separados do OpenSSH em ~/.ssh/config.d/
  • Quando você altera um, faça cat ~/.ssh/config.d/* > ~/.ssh/config
  • No glorioso dia em que você atualiza 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/*

    
por 06.05.2018 / 18:38
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)

Em seguida, ssh é aliased para

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

Funciona como um encanto.

    
por 16.08.2018 / 12:51

Tags