Dlaczego reguły nie łączą się w pliku konfiguracyjnym ssh?

12

Wygląda na to, że następujące elementy działałyby zgodnie z oczekiwaniami, tj. Że druga reguła, mająca nazwę hosta pasującą do pierwszej reguły, zastosuje ją.

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

Host blah
 HostName complicated.hostname.com

Jednak pisanie ssh blahdotyczy tylko drugiej reguły (a nie pliku użytkownika lub tożsamości z pierwszej).

Mam dwa pytania:

  1. Dlaczego to się dzieje?
  2. Czy można (po prostu) zrobić to, co próbuję?
Jérémie
źródło

Odpowiedzi:

9

Ze strony podręcznika ssh_config:

Dla każdego parametru zostanie wykorzystana pierwsza uzyskana wartość. Pliki konfiguracyjne zawierają sekcje oddzielone specyfikacjami „Host”, a sekcja ta jest stosowana tylko dla hostów, które pasują do jednego z wzorców podanych w specyfikacji. Dopasowana nazwa hosta to nazwa podana w wierszu polecenia.

Ponieważ używana jest pierwsza uzyskana wartość dla każdego parametru, na początku pliku należy podać więcej specyficznych dla hosta deklaracji, a na końcu ogólne wartości domyślne.

Dodatkowo upewnij się, że rozumiem te 2 sekcje, jeśli nie wiesz, jak działają Host i WZORY. Trwa tylko 1 poziom dopasowania. Ta funkcja jest bardzo podstawowa pod względem funkcji wyrażania regularnego, ale nadal jest potężna, gdy ją uruchomisz.

Sekcje gospodarza

 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.

WZORY

 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"

Zasady nakładania warstw

Problem z twoim podejściem polega na tym, że wzorzec pasujący do pierwszej sekcji Hosta nie pasuje do drugiej. Zazwyczaj robię coś takiego:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

Jedną z rzeczy, których ludzie zwykle nie rozumieją według tych zasad, jest to, że mogą powtarzać. Więc często robię to z wieloma sekcjami i dzielę je za pomocą Host *.

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2
slm
źródło
3
W twoim przykładzie, w jaki sposób ustawiono „user2”? Myślałem, że używana jest pierwsza uzyskana wartość dla hosta, więc każdy host pasuje do pierwszego bloku i ma ustawiony „użytkownik1”?
jdm
@jdm - Reguły hosta, które są po Host *dopasowanym drugim, będą używać user2 jako domyślnego użytkownika, chyba że sami wyraźnie to określą.
slm
@slm: Znalazłem, że to nie działa. Jeśli połączysz dwóch użytkowników Host * User xxx, a następnie Host * User yyy, następna reguła będzie używać „xxx” - chyba że zrobię coś złego.
Jérémie,
@slm, twój przykład nie działa. W momencie osiągnięcia drugiego miejsca Host *obowiązuje reguła „pierwsza uzyskiwana wartość dla każdego parametru - używana”, a zatem ta i wszystkie poniższe Userdefinicje są ignorowane. Wyjątkiem od tej reguły są IdentityFilesłowa kluczowe, btw.
maxschlepzig
5

SSH stosuje wszystkie sekcje, które pasują do nazwy hosta podanej w wierszu poleceń (tzn. HostNameReguły, które napotyka, nie wpływają na sprawdzenie kolejnych warunków). Jeśli CanonicalizeHostnamejest włączona, ponownie zastosuje pliki konfiguracyjne po zakończeniu, używając zaktualizowanej nazwy hosta. (Niektóre wersje SSH robiły to niezależnie od tego CanonicalizeHostnamei twój przykład działałby z tymi wersjami; ale jest to uważane za błąd przez twórców SSH. Patrz # 2267 ).

Co oznacza, że ​​możesz użyć, CanonicalizeHostnameaby Twój przykład działał, dodając

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

co nie spowoduje żadnej kanonizacji, ale umożliwi wykonanie drugiego przejścia ze zaktualizowaną nazwą hosta. (Pamiętaj, że nadal nie spowoduje to, że parsowanie konfiguracji będzie „rekurencyjne”, po prostu powtórz to raz. Jeśli więc zmienisz nazwę hosta dwa razy, to nie zadziała).

Tgr
źródło
1
Niedawno zaktualizowałem system Ubuntu 14.04 do 16.04, a wraz z nim pojawił się ten błąd. Ta odpowiedź jest idealna; przywraca mi to pierwotne zachowanie. Dzięki!
Brian Malehorn,
Ugh # 2267 oznacza, że Host nickname; Hostname hostnamezwrotki nie są już w stanie zapewnić pseudonimu. Będzie działać, jeśli dodasz CanonizalizeHostname yessłowo kluczowe w każdym bloku pseudonimu, ale podwaja rozmiar bloków pseudonimu i wygląda brzydko.
studog
1

Ze strony podręcznika

Dla każdego parametru zostanie wykorzystana pierwsza uzyskana wartość. Pliki konfiguracyjne zawierają sekcje oddzielone specyfikacjami „Host”, a sekcja ta jest stosowana tylko dla hostów, które pasują do jednego ze wzorów podanych w specyfikacji. Dopasowana nazwa hosta to nazwa podana w wierszu polecenia.

Ponieważ używana jest pierwsza uzyskana wartość dla każdego parametru, na początku pliku należy podać więcej specyficznych dla hosta deklaracji, a na końcu ogólne wartości domyślne.

Spróbuj zmienić kolejność wpisów.

spuder
źródło
Niestety zmiana kolejności wpisów nie działa (w rzeczywistości była to kolejność, której pierwotnie użyłem).
Jérémie,
Jeśli istnieje wiele definicji hosta pasujących do nazwy hosta, z którym się łączysz, wszystkie parametry zdefiniowane we wszystkich z nich zostaną połączone w jedną definicję. Kiedy mówi „pierwsza uzyskana wartość”, mówi o rzeczach na poziomie parametru, a nie na poziomie hosta. Jest to sprzeczne z intuicją, jeśli myślisz o każdym bloku Hosta jako definicji.
Giovanni Tirloni,