Kurallar neden bir ssh config dosyasında birleştirilmiyor?


12

Aşağıdaki gibi beklendiği gibi çalışır, yani ilk kuralla eşleşen bir ana bilgisayar adına sahip ikinci kuralın onu uygulayacağı anlaşılır.

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

Host blah
 HostName complicated.hostname.com

Ancak yazmak ssh blahsadece ikinci kuralı uygular (ilk kuralın kullanıcı veya kimlik dosyasını değil).

İki sorum var:

  1. Bu neden oluyor?
  2. Yapmaya çalıştığım şeyi (basitçe) yapmak mümkün mü?

Yanıtlar:


9

Gönderen ssh_configadam sayfası:

Her parametre için ilk elde edilen değer kullanılacaktır. Yapılandırma dosyaları "Ana Bilgisayar" spesifikasyonlarıyla ayrılmış bölümler içerir ve bu bölüm yalnızca spesifikasyonda verilen kalıplardan biriyle eşleşen ana makineler için uygulanır. Eşleşen ana bilgisayar adı, komut satırında verilen addır.

Her parametre için ilk elde edilen değer kullanıldığından, dosyanın başına daha fazla anasisteme özgü bildirimler ve sonunda genel varsayılanlar verilmelidir.

Ayrıca Host ve PATTERNS işlevlerinin nasıl çalıştığından emin değilseniz bu 2 bölümü anladığımdan emin olurum. Sadece 1 seviye eşleşme var. Bu tesis regex yeteneklerinde çok basit, ama bir kez baktığınızda hala güçlü.

Ana bilgisayar bölümleri

 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.

DESENLER

 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"

Katmanlama kuralları

Yaklaşımınızdaki sorun, 1. Ana Makine bölümü ile eşleşen modelin 2. Ana Bölüm ile eşleşmemesidir. Genellikle böyle bir şey yapmak:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

İnsanların genellikle bu kurallara uymadığı bir şey, tekrar edebilmeleridir. Bu yüzden sık sık yaptığım şey birden fazla bölüme sahip olmak ve bunları kullanarak Host *ayırıyorum.

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2

3
Örneğinizde, "kullanıcı2" nasıl ayarlandı? Bir ana bilgisayar için ilk elde edilen değerin kullanıldığını düşündüm, bu yüzden her ana bilgisayar ilk blokla eşleşecek ve "kullanıcı1" ayarlanmış olacak mı?
JDM

@jdm - Eşleştirilen 2.'den sonra gelen ana bilgisayar kuralları, Host *açıkça kendileri belirtmedikçe user2'yi varsayılan kullanıcı olarak kullanır.
slm

@slm: Aslında bunun işe yaramadığını gördüm. Eğer iki Host * Kullanıcı xxx ve sonra Host * Kullanıcı yyy zincir eğer yanlış bir şey yapmazsanız bir sonraki kural "xxx" kullanacaktır.
Jérémie

@slm, örneğin çalışmıyor. Zamanda 2 Host *'ulaşıldığında birinci elde-fiyat-her-parametre-is-used'-kural geçerlidir ve dolayısıyla bu ve bundan sonraki tüm Usertanımlamalar dikkate alınmaz. Bu kuralın bir istisnası IdentityFile, btw anahtar kelimeleridir.
maxschlepzig

5

SSH, ana makine adıyla eşleşen tüm bölümleri komut satırında belirtildiği şekilde uygular (yani HostNamekarşılaştığı kurallar sonraki koşul denetimlerini etkilemez). Eğer CanonicalizeHostnameetkindir güncellenmesi host ismiyle, bittiğinde, tekrar yapılandırma dosyaları yeniden. (Bazı SSH sürümleri ne olursa olsun bunu yaptı CanonicalizeHostnameve örneğiniz bu sürümlerle çalışır; ancak bu, SSH geliştiricileri tarafından bir hata olarak kabul edilir. Bkz. # 2267. )

Bu da CanonicalizeHostname, örneğin

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

standartlaştırma yapılmaz, ancak güncellenen ana makine adıyla ikinci bir geçiş yapılmasına olanak tanır. (Yapılandırmayı "özyinelemeli" ayrıştırmaya devam etmeyeceğini unutmayın, yalnızca bir kez tekrarlayın. Bu nedenle, ana bilgisayar adını iki kez değiştirirseniz, işe yaramaz.)


1
Son zamanlarda Ubuntu 14.04'ü 16.04'e yükselttim ve bununla birlikte bu hata geldi. Bu cevap mükemmel; beni orijinal davranışa geri götürüyor. Teşekkürler!
Brian Malehorn

ugh # 2267, Host nickname; Hostname hostnamestanzaların artık takma ad veremediği anlamına gelir . CanonizalizeHostname yesHer takma ad bloğuna anahtar kelime eklerseniz çalışır , ancak bu takma ad bloklarının boyutunu iki katına çıkarır ve çirkin görünür.
studog

1

Man sayfasından

Her parametre için ilk elde edilen değer kullanılacaktır. Yapılandırma dosyaları, '' Ana Bilgisayar '' spesifikasyonlarıyla ayrılmış bölümler içerir ve bu bölüm yalnızca spesifikasyonda verilen kalıplardan biriyle eşleşen ana makineler için uygulanır. Eşleşen ana bilgisayar adı, komut satırında verilen addır.

Her parametre için ilk elde edilen değer kullanıldığından, dosyanın başına daha fazla anasisteme özgü bildirimler ve sonunda genel varsayılanlar verilmelidir.

Girişlerinizin sırasını değiştirmeyi deneyin.


Ne yazık ki girişlerin sırasını değiştirmek işe yaramıyor (aslında ilk kullandığım emirdi).
Jérémie

Bağlandığınız ana bilgisayar adıyla eşleşen birden çok Ana Bilgisayar tanımı varsa, hepsinde tanımlanan tüm parametreler tek bir tanımda birleştirilir. "İlk elde edilen değer" derken, Ana makine düzeyinde değil, parametre düzeyinde olan şeylerden bahseder. Her bir Host bloğunu bir tanım olarak düşünüyorsanız, bu sezgiseldir.
Giovanni Tirloni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.