Várias entradas semelhantes na configuração do ssh

193

Digamos que eu queira configurar minhas sshopções para 30 servidores com a mesma configuração no meu .ssh configarquivo:

host XXX
     HostName XXX.YYY.com
     User my_username
     Compression yes
     Ciphers arcfour,blowfish-cbc
     Protocol 2
     ControlMaster auto
     ControlPath ~/.ssh/%r@%h:%p
     IdentityFile ~/.ssh/YYY/id_rsa

onde a única coisa que muda entre essas 30 máquinas é XXX.

Em vez de repetir a estrutura acima 30 vezes no meu configarquivo, existe outra maneira de definir um intervalo de máquinas?

Amelio Vazquez-Reina
fonte

Respostas:

232

Na ssh_config(5)página do manual:

 Host    Restricts the following declarations (up to the next Host key‐
         word) to be only for those hosts that match one of the patterns
         given after the keyword.  If more than one pattern is provided,
         they should be separated by whitespace.

...

 HostName
         Specifies the real host name to log into.  This can be used to
         specify nicknames or abbreviations for hosts.  If the hostname
         contains the character sequence ‘%h’, then this will be replaced
         with the host name specified on the commandline (this is useful
         for manipulating unqualified names).

Assim:

Host XXX1 XXX2 XXX3
  HostName %h.YYY.com
Ignacio Vazquez-Abrams
fonte
9
Parece que o %hrecurso apareceu na versão 5.6 do OpenSSH . Fiquei me perguntando por que eu não tinha visto isso antes - a versão no Debian Squeeze é 5.5.
Jw013
2
Se você estiver em um sistema operacional antigo ou precisar de regras não compatíveis config, sempre poderá escrever um script simples que gere o seu config.
Roger Dahl
69

Para minimizar a configuração, você pode ter um .ssh/configcomo este

Host X01
    HostName X01.YYY.com

Host X02
    HostName X02.YYY.com

...

Host X01 X02 ...
     User my_username
     Compression yes
     Ciphers arcfour,blowfish-cbc
     Protocol 2
     ControlMaster auto
     ControlPath ~/.ssh/%r@%h:%p
     IdentityFile ~/.ssh/YYY/id_rsa

Host X01 X02 ...poderia ser substituído por Host *se cada host tiver a seguinte configuração

Guillaume Vincent
fonte
2
Essa parece ser a única resposta que realmente ajuda o OP (e eu).
Mad Physicist
Qual é a ordem de prioridade? É apenas o material definido posteriormente no arquivo substitui o material definido anteriormente no arquivo? Como se eu tivesse "Compressão não" em "Host X01", isso seria substituído por "Compressão sim" em "Host X01 X02"?
Ben Farmer
1
No manual ssh_config: Como o primeiro valor obtido para cada parâmetro é usado, mais declarações específicas do host devem ser fornecidas no início do arquivo e padrões gerais no final.
Guillaume Vincent
Pode Host X01 X02 ...ser substituído por *.YYY.com? Isso parece um pouco mais gerenciável se funcionar.
Michael
51

Basta usar *

Veja man ssh_config:

PADRÕES Um padrão consiste em zero ou mais caracteres que não sejam espaços em branco, '*' (um curinga que corresponde a zero ou mais caracteres) ou '?' (um curinga que corresponde exatamente a um caractere). Por exemplo, para especificar um conjunto de declarações para qualquer host no conjunto de domínios ".co.uk", o seguinte padrão pode ser usado:

       Host *.co.uk

 The following pattern would match any host in the 192.168.0.[0-9] network range:

       Host 192.168.0.?

 A pattern-list is a comma-separated list of patterns.  Patterns within pattern-lists may be negated by preceding them with an
 exclamation mark (‘!’).  For example, to allow a key to be used from anywhere within an organisation except from the “dialup”
 pool, the following entry (in authorized_keys) could be used:

       from="!*.dialup.example.com,*.example.com"
H.-Dirk Schmitt
fonte
Obrigado! Parece ser o que eu preciso, mas ainda não entendo como adaptá-lo ao meu caso. Uso um ponto de interrogação ?sempre que quero que seja substituído pelo padrão correspondente ao *sinal?
Amelio Vazquez-Reina
2
Hmm. Eu acho que os padrões servem a um propósito diferente do que eu preciso. Eles redirecionam várias consultas para a mesma configentrada, mas os parâmetros do Host são fixos (ou seja, os padrões não podem ser usados ​​para modelar os parâmetros). Estou errado?
Amelio Vazquez-Reina
4
@ user27915816 Sim, você está certo, não há como criar "modelos" tanto quanto eu sei. O melhor que você pode fazer é separar as linhas constantes em uma única Host *entrada e ter uma entrada separada para cada uma Host XXXque consiste apenas nas partes que variam (ou seja, na Hostname XXX.YYY.ZZZlinha).
Jw013
Esta página é o resultado principal (por enquanto) no Google "curing ssh config", por isso, obrigado por fornecer uma resposta que atenda a essa pergunta.
vastlysuperiorman 10/09/18
9

Das respostas de Ignacio Vazquez-Abrams e H.-Dirk Schmitt, pode-se adicionar o seguinte a .ssh / config

HOST XXX*
    HostName %h.YYY.com
    User myname

e, por exemplo, você pode fazer login como [email protected]

ssh XXX2
Vito Chou
fonte
desde XXX * já implica XXX.YYY.com, HostName deve ser apenas %h, não%h.YYY.com
biocyberman
8

isso funciona para mim:

CanonicalizeHostname sim
CanonicalDomains xxx.auckland.ac.nz yyy.auckland.ac.nz

host * .xxx.auckland.ac.nz
   usuário myuser
host * .aaa.auckland.ac.nz
   usuário myuser

isso permite usar nomes no domínio e alterar o nome de usuário:

bluebottle: ~ user_one $ ssh itslogprd05
senha do [email protected]: 
Russell Fulton
fonte
Esta é a melhor resposta para mim. Eu me livrei do script que costumava usar para gerar minha configuração!
Jooks
E se itslogprd05existir um host nos dois domínios? xxx.auckland.ac.nzvitórias, eu acho?
Levente Huszko