Mengapa aturan tidak digabungkan dalam file konfigurasi ssh?

12

Sepertinya yang berikut ini akan berfungsi seperti yang diharapkan, yaitu, bahwa aturan kedua, memiliki nama host yang cocok dengan aturan pertama, akan menerapkannya.

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

Host blah
 HostName complicated.hostname.com

Namun pengetikan ssh blahhanya menerapkan aturan kedua (dan bukan pengguna atau file identitas yang pertama).

Saya punya dua pertanyaan:

  1. Mengapa ini terjadi?
  2. Apakah mungkin (secara sederhana) melakukan apa yang saya coba lakukan?
Jérémie
sumber

Jawaban:

9

Dari ssh_confighalaman manual:

Untuk setiap parameter, nilai yang diperoleh pertama akan digunakan. File konfigurasi berisi bagian yang dipisahkan oleh spesifikasi "Host", dan bagian itu hanya berlaku untuk host yang cocok dengan salah satu pola yang diberikan dalam spesifikasi. Nama host yang cocok adalah yang diberikan pada baris perintah.

Karena nilai yang diperoleh pertama untuk setiap parameter digunakan, lebih banyak deklarasi khusus host harus diberikan di dekat awal file, dan default umum di akhir.

Selain itu saya akan memastikan saya memahami 2 bagian ini jika Anda tidak jelas bagaimana fungsi Host dan POLA. Hanya ada 1 level pencocokan yang terjadi. Fasilitas ini sangat mendasar dalam kemampuan regexnya, tetapi masih kuat sekali Anda grok.

Bagian inang

 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.

POLA

 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"

Aturan pelapisan

Masalah dengan pendekatan Anda adalah bahwa pola yang cocok dengan bagian Host pertama tidak cocok dengan yang kedua. Saya biasanya melakukan sesuatu seperti ini:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

Satu hal yang orang biasanya tidak mengerti dengan aturan ini adalah mereka bisa mengulanginya. Jadi yang sering saya lakukan adalah memiliki beberapa bagian dan saya memecahnya menggunakan Host *.

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2
slm
sumber
3
Dalam contoh Anda, bagaimana "user2" pernah diatur? Saya pikir nilai yang diperoleh pertama untuk suatu host digunakan, sehingga setiap host akan cocok dengan blok pertama dan memiliki set "user1"?
jdm
@jdm - Aturan host yang muncul setelah tanggal 2 Host *yang cocok akan menggunakan user2 sebagai pengguna default mereka, kecuali jika mereka secara eksplisit menentukannya sendiri.
slm
@slm: Saya benar-benar menemukan itu tidak berfungsi. Jika Anda rantai dua Host * Pengguna xxx dan kemudian Host * Pengguna yyy aturan selanjutnya akan menggunakan "xxx" - kecuali saya melakukan sesuatu yang salah.
Jérémie
@slm, contoh Anda tidak berfungsi. Pada saat ke-2 Host *tercapai, aturan 'diperoleh-nilai-pertama-untuk-setiap-parameter-digunakan-berlaku' dan dengan demikian ini dan semua Userdefinisi berikut diabaikan. Pengecualian dari aturan ini adalah IdentityFilekata kunci, btw.
maxschlepzig
5

SSH menerapkan semua bagian yang cocok dengan nama host seperti yang disediakan pada baris perintah (mis. HostNameAturan yang dihadapinya tidak mempengaruhi pemeriksaan kondisi selanjutnya). Jika CanonicalizeHostnamediaktifkan, itu akan menerapkan kembali file konfigurasi lagi setelah selesai, menggunakan nama host yang diperbarui. (Beberapa versi SSH melakukan ini terlepas dari CanonicalizeHostnamedan contoh Anda akan bekerja dengan versi tersebut; tetapi itu dianggap sebagai bug oleh SSH devs. Lihat # 2267 )

Yang berarti Anda dapat menggunakan CanonicalizeHostnameuntuk membuat contoh Anda berfungsi, dengan menambahkan

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

yang tidak akan melakukan kanonikisasi apa pun tetapi akan memungkinkan melakukan pass kedua dengan nama host yang diperbarui. (Perhatikan bahwa itu masih tidak akan membuat parsing konfigurasi "rekursif", cukup ulangi sekali. Jadi jika Anda mengubah nama host dua kali, itu tidak akan berhasil.)

Tgr
sumber
1
Baru-baru ini saya memutakhirkan Ubuntu 14.04 hingga 16.04, dan bersamaan dengan itu muncullah bug ini. Jawaban ini sempurna; itu membuat saya kembali ke perilaku semula. Terima kasih!
Brian Malehorn
ugh # 2267 berarti bahwa Host nickname; Hostname hostnamebait tidak lagi dapat memberikan julukan. Ini akan berfungsi jika Anda menambahkan CanonizalizeHostname yeskata kunci di setiap blok nama panggilan, tetapi itu menggandakan ukuran blok nama panggilan dan terlihat jelek.
Studog
1

Dari halaman manual

Untuk setiap parameter, nilai yang diperoleh pertama akan digunakan. File konfigurasi berisi bagian yang dipisahkan oleh spesifikasi 'Host', dan bagian itu hanya diterapkan untuk host yang cocok dengan salah satu pola yang diberikan dalam spesifikasi. Nama host yang cocok adalah yang diberikan pada baris perintah.

Karena nilai yang diperoleh pertama untuk setiap parameter digunakan, lebih banyak deklarasi khusus host harus diberikan di dekat awal file, dan default umum di akhir.

Coba alihkan urutan entri Anda.

spuder
sumber
Sayangnya mengganti urutan entri tidak berfungsi (itu sebenarnya urutan yang semula saya gunakan).
Jérémie
Jika ada beberapa definisi Host yang cocok dengan nama host yang Anda hubungkan, semua parameter yang ditentukan di dalamnya akan digabung menjadi satu definisi. Ketika dikatakan "nilai pertama yang diperoleh" itu berbicara tentang hal-hal di tingkat parameter, bukan tingkat Host. Ini kontra-intuitif jika Anda menganggap setiap blok Host sebagai definisi.
Giovanni Tirloni