Múltiples entradas similares en ssh config

193

Digamos que quiero configurar mis sshopciones para 30 servidores con la misma configuración en mi .ssh configarchivo:

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

donde lo único que cambia entre estas 30 máquinas es XXX.

En lugar de repetir la estructura anterior 30 veces en mi configarchivo, ¿hay otra forma de definir una gama de máquinas?

Amelio Vazquez-Reina
fuente

Respuestas:

232

Desde la ssh_config(5)página del 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).

Entonces:

Host XXX1 XXX2 XXX3
  HostName %h.YYY.com
Ignacio Vazquez-Abrams
fuente
99
Parece que la %hcaracterística apareció en la versión 5.6 de OpenSSH . Me preguntaba por qué no lo había visto antes: la versión en Debian Squeeze es 5.5.
jw013
2
Si está en un sistema operativo antiguo o necesita reglas que no son compatibles config, siempre puede escribir un script simple que genere su config.
Roger Dahl el
69

Para minimizar la configuración, puede tener una .ssh/configcomo esta

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 ...podría reemplazarse Host *si cada host tiene la siguiente configuración

Guillaume Vincent
fuente
2
Esta parece ser la única respuesta que realmente ayuda al OP (y a mí mismo).
Físico loco
¿Cuál es el orden de prioridad? ¿Son solo las cosas definidas más adelante en el archivo que anula las cosas definidas anteriormente en el archivo? Como decir que tenía "Compresión no" en "Host X01", ¿eso sería anulado por "Compresión sí" en "Host X01 X02"?
Ben Farmer
1
Del manual ssh_config: dado que se utiliza el primer valor obtenido para cada parámetro, se deben dar más declaraciones específicas del host cerca del comienzo del archivo y valores predeterminados generales al final.
Guillaume Vincent
Puede Host X01 X02 ...ser reemplazado por *.YYY.com? Eso parece un poco más manejable si funciona.
Michael
51

Simplemente use *

Ver man ssh_config:

PATRONES Un patrón consta de cero o más caracteres que no son espacios en blanco, '*' (un comodín que coincide con cero o más caracteres) o '?' (un comodín que coincide exactamente con un personaje). Por ejemplo, para especificar un conjunto de declaraciones para cualquier host en el conjunto de dominios ".co.uk", se podría usar el siguiente patrón:

       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
fuente
¡Gracias! Eso parece ser lo que necesito, pero todavía no entiendo cómo adaptarlo a mi caso. ¿Uso un signo de interrogación ?donde quiera que sea reemplazado por el patrón que coincide con el *signo?
Amelio Vazquez-Reina
2
Hmm Creo que los patrones tienen un propósito diferente de lo que necesito. Redirigen múltiples consultas a la misma configentrada, pero los parámetros del Host son fijos (es decir, los patrones no pueden usarse para modelar los parámetros). ¿Me equivoco?
Amelio Vazquez-Reina
44
@ user27915816 Sí, tienes razón, por lo que sé, no hay forma de hacer "plantillas". Lo mejor que puede hacer es separar las líneas constantes en una sola Host *entrada, y tener una entrada separada para cada una Host XXXque consista solo en las partes que varían (es decir, la Hostname XXX.YYY.ZZZlínea).
jw013
Esta página es el resultado principal (por ahora) cuando buscas en Google "comodines de configuración ssh", así que gracias por proporcionar una respuesta que aborde esa pregunta.
vastlysuperiorman
9

De las respuestas de Ignacio Vázquez-Abrams y H.-Dirk Schmitt, se puede agregar lo siguiente a .ssh / config

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

y luego, por ejemplo, puede iniciar sesión como [email protected] por

ssh XXX2
Vito Chou
fuente
dado que XXX * ya implica XXX.YYY.com, HostName solo debería ser %h, no%h.YYY.com
biocyberman
8

esto funciona para mi:

CanonicalizeHostname sí
CanonicalDomains xxx.auckland.ac.nz yyy.auckland.ac.nz

host * .xxx.auckland.ac.nz
   usuario myuser
host * .yyy.auckland.ac.nz
   usuario myuser

esto le permite a uno usar nombres dentro del dominio y cambiar el nombre de usuario:

bluebottle: ~ user_one $ ssh itslogprd05
Contraseña de [email protected]: 
Russell Fulton
fuente
Esta es la mejor respuesta para mí. ¡Me deshice del script que solía usar para generar mi configuración!
bromea
¿Qué pasa si itslogprd05existe un host en ambos dominios? xxx.auckland.ac.nzgana, supongo?
Levente Huszko