Por que as regras não estão combinadas em um arquivo de configuração ssh?

9

Parece que o seguinte funcionaria como esperado, ou seja, que a segunda regra, com um nome de host que corresponda à primeira regra, seria aplicada.

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

Host blah
 HostName complicated.hostname.com

No entanto, digitar ssh blah somente aplica a segunda regra (e não o usuário ou o arquivo de identidade do primeiro).

Eu tenho duas perguntas:

  1. Por que isso está acontecendo?
  2. É possível (simplesmente) fazer o que estou tentando fazer?
por Jérémie 20.02.2014 / 02:35

3 respostas

7

Na página ssh_config man:

For each parameter, the first obtained value will be used. The configuration files contain sections separated by “Host” specifications, and that section is only applied for hosts that match one of the patterns given in the specification. The matched host name is the one given on the command line.

Since the first obtained value for each parameter is used, more host-specific declarations should be given near the beginning of the file, and general defaults at the end.

Além disso, certifique-se de que entendi essas duas seções se você não souber como o Host e o PATTERNS funcionam. Há apenas 1 nível de correspondência acontecendo. Esse recurso é muito básico em seus recursos de regex, mas ainda é poderoso quando você o grava.

Seções do host

 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.

PADRÕES

 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"

Regras de camadas

O problema com sua abordagem é que o padrão que corresponde à seção do primeiro host não corresponde ao segundo. Eu costumo fazer algo assim:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

Uma coisa que as pessoas geralmente não percebem com essas regras é que elas podem se repetir. Então, o que eu muitas vezes faço é ter várias seções e eu divido-as usando Host * 's.

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2
    
por 20.02.2014 / 02:47
4

O SSH aplica todas as seções que correspondem ao nome do host, conforme fornecido na linha de comando (ou seja, as regras HostName que ele encontra não afetam as verificações de condições subsequentes). Se CanonicalizeHostname estiver ativado, ele irá reaplicar os arquivos de configuração novamente quando terminar, usando o nome do host atualizado. (Algumas versões SSH fizeram isso independentemente de CanonicalizeHostname e seu exemplo funcionaria com essas versões; mas isso é considerado um bug pelos desenvolvedores do SSH. Veja # 2267 .)

O que significa que você pode usar CanonicalizeHostname para fazer seu exemplo funcionar, adicionando

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

que não fará nenhuma canonização, mas permitirá fazer uma segunda passagem com o nome do host atualizado. (Note que ele ainda não fará a análise de configuração "recursiva", apenas repita uma vez. Então, se você alterar o nome do host duas vezes, isso não funcionará.)

    
por 07.09.2016 / 04:23
1

Da página do manual

For each parameter, the first obtained value will be used. The configuration files contain sections separated by ''Host'' specifications, and that section is only applied for hosts that match one of the patterns given in the specification. The matched host name is the one given on the command line.

Since the first obtained value for each parameter is used, more host-specific declarations should be given near the beginning of the file, and general defaults at the end.

Tente mudar a ordem das suas entradas.

    
por 20.02.2014 / 02:43

Tags