Você pode ter mais de um arquivo ~ / .ssh / config?

82

Temos um servidor bastião que usamos para conectar-se a vários hosts, e nosso .ssh / config aumentou para mais de mil linhas (temos centenas de hosts aos quais nos conectamos). Isso está começando a ficar um pouco pesado e eu gostaria de saber se existe uma maneira de dividir o arquivo .ssh / config em vários arquivos. Idealmente, especificaríamos em algum lugar que outros arquivos seriam tratados como um arquivo .ssh / config, possivelmente como:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

Eu li a documentação em ssh / config e não vejo que isso seja possível. Mas talvez alguém tenha tido um problema semelhante e tenha encontrado uma solução.

wrangler
fonte
Faça com que cada usuário faça login no host bastião com seu próprio nome de usuário. Além disso, o que você está colocando no arquivo de configuração que requer uma entrada para cada host? Você não pode definir alguns padrões comuns?
Jed Daniels
1
A mesma pergunta no superuser.com: superuser.com/questions/247564/…
guettli
1
Em breve, no OpenSSH 7.3 isso deve ser possível. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Respostas:

51

O ~/.ssh/configarquivo não possui uma diretiva para incluir outros arquivos, possivelmente relacionados à verificação de permissões de arquivo do SSH.

As sugestões para isso podem incluir um script para reunir várias alterações no sistema ou através de ganchos de check-in em um repositório. Pode-se também procurar ferramentas como Puppet ou Augeas.

Entretanto, no entanto, você precisa concatenar arquivos individuais para que sejam um único arquivo de fora do arquivo.

$ cat ~/.ssh/config_* >> ~/.ssh/config

note: substituir: > vs acrescentar:>>

Atualização em dezembro de 2017:

A partir de 7.3p1, há a opção Incluir. O que permite incluir arquivos de configuração.

Include
    Include the specified configuration file(s).  Mul‐
    tiple pathnames may be specified and each pathname
    may contain glob(3) wildcards and, for user config‐
    urations, shell-like “~” references to user home
    directories.  Files without absolute paths are
    assumed to be in ~/.ssh if included in a user con‐
    figuration file or /etc/ssh if included from the
    system configuration file.  Include directive may
    appear inside a Match or Host block to perform con‐
    ditional inclusion.
Jeff Ferland
fonte
Obrigado Jeff, é uma boa ideia. Não sei muito sobre o Puppet ou o Augeas, portanto, para manter as coisas o mais simples possível, sua solução parece melhor. Eu poderia dividir a configuração em várias configurações e criar um script simples para recriar o arquivo .ssh / config sempre que um dos arquivos fosse modificado. Não sei o quão limpa é uma solução, mas ela parece funcionar e funciona para meus propósitos.
Wrangler
52

Você pode especificar o arquivo de configuração atual a ser usado na opção ssh assim:

ssh -F /path/to/configfile

Parece que é o único caminho.

Também há hoje em dia para incluir uma configuração em outra.

pressa
fonte
Uma boa opção para usar o módulo Net :: OpenSSH do Perl (por exemplo, para vários arquivos de chave privada.), Onde o módulo não oferece todas as possibilidades.
Jimmy Koerting
36

A partir do ssh 7.3 (lançado em 1º de agosto de 2016), uma Includediretiva está disponível.

Incluir : 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 curingas globais e referências "~" semelhantes a shell para diretórios pessoais do usuário. Arquivos sem caminhos absolutos são assumidos como estando ~/.ssh. Uma Includediretiva pode aparecer dentro de um bloco Matchou Hostpara executar a 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
2
Isso é muito legal. Estamos ansiosos por isso. Deve, finalmente, resolver este problema o caminho certo :)
wrangler
2
Basta adicionar a diretiva Include na parte superior do configarquivo. Não consigo descobrir por que não está funcionando no fundo.
pylover 28/09/18
17

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 ajude.

Szymon Jeż
fonte
ssh -F <(cat .ssh/*.config)seria o ideal. Também vim com isso, mas estou recebendo o mesmo erro. Alguém sabe qual é o problema aqui?
sickill
2
O ssh verifica as permissões de arquivo, acho que esse tipo de redirecionamento não suporta essa verificação.
Camden Narzt 25/09
2

Eu também usaria cat config_* > configpara gerar toda a configuração. Mas eu não usaria puppet / cfengine etc para isso, se eles ainda não estiverem no lugar (BTW: por que não usar um sistema de gerenciamento de configurações ???).

Eu geraria um pacote (deb, rpm) e o colocaria em um repositório local. E no script postinst, o gato gera sua configuração. Talvez você também inclua uma pasta local ... A vantagem é que as atualizações do ssh / config são ativadas diariamente enquanto o cron-apt & Co é executado.

ThorstenS
fonte
0

Você pode usar um Makefile em ~/.ssh:

    config: config.in config.app.in
        > $@
        (for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@

    config.app.in:
        (echo "# Generated with foobar.sh."; \
            foobar.sh) > $@
    .PHONY: config.app.in

Em seguida, mova seu existente configpara config.ine execute makepara gerar config.

azulado
fonte
0

Eu tenho jogado com o conceito de um config.ddiretório para a minha organização de configuração. Então, para adicionar à pilha de opções acima, eis o que está funcionando para mim.

A estrutura de diretórios é algo como

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish

A função que cria o ~ / .ssh / config e mora na run-config do meu shell é a seguinte

sshMakeConfig() {
    echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
    for i in ~/.ssh/config.d/*
        do echo "#${i}" | tee -a ~/.ssh/config
        cat ${i} >> ~/.ssh/config
    done
}

Opcionalmente, adicione sshMakeConfigna parte inferior da sua configuração de execução se quiser garantir uma nova configuração em cada sessão do shell

Sempre que preciso recompilar meu ~ / .ssh / config, faço isso executando sshMakeConfigde alguma forma (diretamente, fornecendo meu run-config ou iniciando um novo shell)

knope
fonte