¿Por qué las reglas no se combinan en un archivo de configuración ssh?

12

Parece que lo siguiente funcionaría como se esperaba, es decir, que la segunda regla, que tiene un nombre de host que coincide con la primera regla, la aplicaría.

Host *.hostname.com
 User myuser
 IdentityFile ~/.ssh/myidentity

Host blah
 HostName complicated.hostname.com

Sin embargo, escribir ssh blahsolo aplica la segunda regla (y no el usuario o el archivo de identidad de la primera).

Tengo dos preguntas:

  1. ¿Por qué está pasando esto?
  2. ¿Es posible (simplemente) hacer lo que estoy tratando de hacer?
Jérémie
fuente

Respuestas:

9

Desde la ssh_configpágina del manual:

Para cada parámetro, se utilizará el primer valor obtenido. Los archivos de configuración contienen secciones separadas por especificaciones de "Host", y esa sección solo se aplica a hosts que coinciden con uno de los patrones dados en la especificación. El nombre de host coincidente es el que aparece en la línea de comando.

Dado que se utiliza el primer valor obtenido para cada parámetro, se deben proporcionar más declaraciones específicas del host cerca del comienzo del archivo y valores predeterminados generales al final.

Además, me aseguraría de comprender estas 2 secciones si no tiene claro cómo funcionan el Host y los PATRONES. Solo hay 1 nivel de coincidencia. Esta instalación es muy básica en sus capacidades de expresión regular, pero sigue siendo poderosa una vez que la asimilas.

Secciones de acogida

 The possible keywords and their meanings are as follows (note that keywords 
 are case-insensitive and arguments are case-sensitive):

 Host    Restricts the following declarations (up to the next Host keyword) 
         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.  A single ‘*’ as a pattern can 
         be used to provide global defaults for all hosts.  The host is the 
         hostname argument given on the command line (i.e. the name is not
         converted to a canonicalized host name before matching).

         A pattern entry may be negated by prefixing it with an exclamation 
         mark (‘!’).  If a negated entry is matched, then the Host entry is      
         ignored, regardless of whether any other patterns on the line 
         match.  Negated matches are therefore useful to provide exceptions 
         for wildcard matches.

         See PATTERNS for more information on patterns.

PATRONES

 A pattern consists of zero or more non-whitespace characters, ‘*’ (a 
 wildcard that matches zero or more characters), or ‘?’ (a wildcard that
 matches exactly one character).  For example, to specify a set of 
 declarations for any host in the “.co.uk” set of domains, the following
 pattern could be used:

       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"

Reglas de capas

El problema con su enfoque es que el patrón que coincide con la primera sección del Host no coincide con la segunda. Normalmente hago algo como esto:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

Una cosa que la gente no suele entender con estas reglas es que pueden repetir. Entonces, lo que a menudo hago es tener varias secciones y las rompo usando Host *'s'.

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2
slm
fuente
3
En su ejemplo, ¿cómo se establece "user2"? Pensé que se usa el primer valor obtenido para un host, por lo que cada host coincidirá con el primer bloque y tendrá "user1" establecido.
jdm
@jdm: las reglas de host que vienen después del 2do Host *que coinciden utilizarán user2 como usuario predeterminado, a menos que lo especifiquen explícitamente.
slm
@slm: De hecho, he descubierto que no funciona. Si encadena dos Host * User xxx y luego Host * User yyy, la siguiente regla usará "xxx", a menos que esté haciendo algo mal.
Jérémie
@slm, tu ejemplo no funciona. En el momento en que Host *se alcanza el 2º, se aplica la regla de "primer valor obtenido para cada parámetro utilizado" y, por lo tanto, esta y todas las siguientes Userdefiniciones se ignoran. Una excepción a esta regla son las IdentityFilepalabras clave, por cierto.
maxschlepzig
5

SSH aplica todas las secciones que coinciden con el nombre de host tal como se proporciona en la línea de comando (es decir, las HostNamereglas que encuentra no afectan las comprobaciones de condiciones posteriores). Si CanonicalizeHostnameestá habilitado, volverá a aplicar los archivos de configuración cuando termine, utilizando el nombre de host actualizado. (Algunas versiones de SSH hicieron esto independientemente de CanonicalizeHostnamey su ejemplo funcionaría con esas versiones; pero eso es considerado un error por los desarrolladores de SSH. Ver # 2267 ).

Lo que significa que puede usar CanonicalizeHostnamepara hacer que su ejemplo funcione, agregando

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

que no hará ninguna canonización pero permitirá hacer una segunda pasada con el nombre de host actualizado. (Tenga en cuenta que aún no hará que el análisis de configuración sea "recursivo", solo repítalo una vez. Por lo tanto, si cambia el nombre de host dos veces, eso no funcionaría).

Tgr
fuente
1
Recientemente actualicé Ubuntu 14.04 a 16.04, y con él vino este error. Esta respuesta es perfecta; me lleva de vuelta al comportamiento original. ¡Gracias!
Brian Malehorn
ugh # 2267 significa que las Host nickname; Hostname hostnameestrofas ya no pueden proporcionar apodos. Funcionará si agrega la CanonizalizeHostname yespalabra clave en cada bloque de apodo, pero eso duplica el tamaño de los bloques de apodo y se ve feo.
studog
1

Desde la página del manual

Para cada parámetro, se utilizará el primer valor obtenido. Los archivos de configuración contienen secciones separadas por especificaciones de '' Host '', y esa sección solo se aplica a hosts que coinciden con uno de los patrones dados en la especificación. El nombre de host coincidente es el que aparece en la línea de comando.

Dado que se utiliza el primer valor obtenido para cada parámetro, se deben proporcionar más declaraciones específicas del host cerca del comienzo del archivo y valores predeterminados generales al final.

Intente cambiar el orden de sus entradas.

Spuder
fuente
Desafortunadamente, cambiar el orden de las entradas no funciona (en realidad era el orden que había usado originalmente).
Jérémie
Si hay varias definiciones de Host que coinciden con el nombre de host al que se está conectando, todos los parámetros definidos en todos ellos se fusionarán en una sola definición. Cuando dice "el primer valor obtenido" está hablando de cosas a nivel de parámetro, no a nivel de Host. Esto es contrario a la intuición si está pensando en cada bloque Host como una definición.
Giovanni Tirloni