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

68

Temos um servidor de bastiões que usamos para nos conectarmos a vários hosts, e nosso .ssh / config cresceu para mais de mil linhas (temos centenas de hosts aos quais nos conectamos). Isso está começando a ficar um pouco complicado e eu gostaria de saber se existe uma maneira de dividir o arquivo .ssh / config em vários arquivos. Idealmente, nós especificamos 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 outra pessoa tenha tido um problema semelhante e tenha encontrado uma solução.

    
por wrangler 31.03.2012 / 19:47

7 respostas

42

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

Sugestões sobre isso podem incluir um script para fazer várias alterações juntas no sistema ou por meio de ganchos de check-in em um repositório. Também é possível procurar ferramentas como Puppet ou Augeas.

No entanto, ao abordá-lo, você terá que concatenar arquivos individuais para serem um único arquivo de fora do arquivo.

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

nota: sobrescreve: > v.s. anexe: >>

Atualização de dezembro de 2017:

A partir de 7.3p1, existe a opção Incluir. 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.
    
por 31.03.2012 / 20:01
41

Você pode especificar o arquivo de configuração atual para usar na opção ssh assim:

ssh -F /path/to/configfile

Parece que é o único jeito.

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

    
por 31.03.2012 / 20:06
31

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:19
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 seja de alguma ajuda.

    
por 27.11.2012 / 16:07
2

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

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 ssh / config são ativadas em uma base diária enquanto o cron-apt & Co é executado.

    
por 31.03.2012 / 21:34
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 config para config.in e execute make para gerar config .

    
por 05.05.2016 / 00:18
0

Eu tenho jogado com o conceito de um diretório config.d para minha organização de configuração. Então, para adicionar à pilha de opções acima, aqui está 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 constrói o ~ / .ssh / config e mora no 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 sshMakeConfig à parte inferior da sua run-config se você quiser garantir uma nova configuração em cada sessão da shell

Sempre que eu precisar recompilar meu ~ / .ssh / config, eu faço isso executando sshMakeConfig de alguma forma (diretamente, obtendo meu run-config, ou iniciando um novo shell)

    
por 16.03.2018 / 13:59