Чому правила не поєднуються у файлі налаштування ssh?


12

Схоже, наступне спрацювало б, як очікувалося, тобто, що друге правило, яке має ім'я хоста, яке відповідає першому правилу, застосовуватиме його.

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

Host blah
 HostName complicated.hostname.com

Однак для введення тексту ssh blahзастосовується лише друге правило (а не файл користувача або ідентифікаційний код першого).

У мене є два питання:

  1. Чому це відбувається?
  2. Чи можна (просто) робити те, що я намагаюся зробити?

Відповіді:


9

На ssh_configчоловіковій сторінці:

Для кожного параметра буде використано перше отримане значення. Файли конфігурації містять розділи, розділені специфікаціями "Host", і цей розділ застосовується лише для хостів, які відповідають одному з шаблонів, наведених у специфікації. Зібране ім'я хоста - це те, яке вказано в командному рядку.

Оскільки використовується перше отримане значення для кожного параметра, слід наводити більш специфічні для хоста декларації біля початку файлу, а загальні параметри за замовчуванням - в кінці.

Крім того, я б переконався, що я розумію ці два розділи, якщо вам незрозуміло, як функціонують хост і PATTERNS. Існує лише 1 рівень узгодження. Цей засіб є дуже базовим у своїх можливостях регулярного виведення, але все ще є потужним, коли ви його зробите.

Хост-секції

 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.

ПАРТНЕРИ

 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"

Правила шарування

Проблема вашого підходу полягає в тому, що шаблон, який відповідає 1-му розділу хоста, не відповідає другому. Я зазвичай роблю щось подібне:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

Одне, що люди зазвичай не дотримуються цих правил, - це те, що вони можуть повторити. Тож, що я часто роблю, - це кілька розділів, і я розбиваю їх за допомогою Host *'s.

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2

3
У вашому прикладі, як встановлюється "user2"? Я думав, що використовується перше отримане значення для хоста, тому кожен хост буде відповідати першому блоку і мати "user1" набір?
jdm

@jdm - Правила хоста, які з’являються після 2-го Host *узгодженого, будуть використовувати user2 як свого користувача за замовчуванням, якщо вони прямо не вказали його самі.
slm

@slm: Я фактично виявив, що це не працює. Якщо ви з'єднаєте двох хостів * User xxx, а потім Host * User yyy, наступним правилом буде використовувати "xxx" - якщо я не роблю щось не так.
Jérémie

@slm, ваш приклад не працює. Під час досягнення другого Host *правила застосовується правило "перше отримане значення для кожного параметра-використовується", і це і всі наступні Userвизначення ігноруються. Виняток із цього правила - IdentityFileключові слова, btw.
maxschlepzig

5

SSH застосовує всі розділи, які відповідають імені хоста, як зазначено в командному рядку (тобто HostNameправила, з якими він стикається, не впливають на наступні перевірки умов). Якщо CanonicalizeHostnameце ввімкнено, він знову застосує файли конфігурації після його закінчення, використовуючи оновлене ім'я хоста. (Деякі версії SSH робили це незалежно від того, CanonicalizeHostnameі ваш приклад буде працювати з цими версіями; але це вважається помилкою розробників SSH. Див. № 2267. )

Що означає, що ви можете використовувати, CanonicalizeHostnameщоб ваш приклад працював, додаючи

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

який не буде робити ніякої канонізації, але дозволить зробити другий пропуск з оновленим іменем хоста. (Зверніть увагу, що розбір конфігурації все ще не зробить "рекурсивний", просто повторіть його один раз. Отже, якщо ви зміните ім'я хоста двічі, це не буде працювати.)


1
Нещодавно я модернізував Ubuntu 14.04 до 16.04, і разом з ним з'явилася ця помилка. Ця відповідь ідеальна; це повертає мене до початкової поведінки. Дякую!
Брайан Малехорн

ugh # 2267 означає, що Host nickname; Hostname hostnameстрофи вже не в змозі надати прізвисько. Він працюватиме, якщо ви додасте CanonizalizeHostname yesключове слово у кожен блок псевдонімів, але це подвоює розмір блоків псевдоніма і виглядає некрасиво.
студог

1

З чоловічої сторінки

Для кожного параметра буде використано перше отримане значення. Файли конфігурації містять розділи, розділені специфікаціями '' Хост '', і цей розділ застосовується лише для хостів, які відповідають одному з шаблонів, наведених у специфікації. Зібране ім'я хоста - це те, яке вказано в командному рядку.

Оскільки використовується перше отримане значення для кожного параметра, слід наводити більш специфічні для хоста декларації біля початку файлу, а загальні параметри за замовчуванням - в кінці.

Спробуйте переключити порядок введення.


На жаль, переключення порядку записів не працює (це було фактично замовлення, яке я використовував спочатку).
Jérémie

Якщо існує декілька визначень хостів, які відповідають імені хоста, до якого ви підключаєтесь, усі параметри, визначені у всіх, будуть об'єднані в одне визначення. Коли він говорить "перше отримане значення", це говорить про речі на рівні параметрів, а не на рівні хосту. Це контр-інтуїтивно, якщо ви думаєте про кожен блок хостів як про визначення.
Джованні Тірлоні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.