Несколько похожих записей в конфигурации ssh

193

Скажем, я хочу настроить sshпараметры для 30 серверов с такой же настройкой в ​​моем .ssh configфайле:

host XXX
     HostName XXX.YYY.com
     User my_username
     Compression yes
     Ciphers arcfour,blowfish-cbc
     Protocol 2
     ControlMaster auto
     ControlPath ~/.ssh/%r@%h:%p
     IdentityFile ~/.ssh/YYY/id_rsa

где единственное, что меняется между этими 30 машинами, это XXX.

Вместо повторения описанной выше структуры 30 раз в моем configфайле, есть ли другой способ определить диапазон машин?

Амелио Васкес-Рейна
источник

Ответы:

232

Со ssh_config(5)страницы руководства :

 Host    Restricts the following declarations (up to the next Host key‐
         word) 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.

...

 HostName
         Specifies the real host name to log into.  This can be used to
         specify nicknames or abbreviations for hosts.  If the hostname
         contains the character sequence ‘%h’, then this will be replaced
         with the host name specified on the commandline (this is useful
         for manipulating unqualified names).

Так:

Host XXX1 XXX2 XXX3
  HostName %h.YYY.com
Игнасио Васкес-Абрамс
источник
9
Похоже, эта %hфункция появилась в выпуске 5.6 OpenSSH . Мне было интересно, почему я этого раньше не видел - версия в Debian Squeeze - 5.5.
jw013
2
Если вы работаете в старой ОС или вам нужны правила, которые не поддерживаются config, вы всегда можете просто написать простой скрипт, который сгенерирует ваш config.
Роджер Даль
69

Чтобы свести к минимуму настройки, вы можете иметь .ssh/configтакой

Host X01
    HostName X01.YYY.com

Host X02
    HostName X02.YYY.com

...

Host X01 X02 ...
     User my_username
     Compression yes
     Ciphers arcfour,blowfish-cbc
     Protocol 2
     ControlMaster auto
     ControlPath ~/.ssh/%r@%h:%p
     IdentityFile ~/.ssh/YYY/id_rsa

Host X01 X02 ...можно заменить, Host *если каждый хост имеет следующую конфигурацию

Гийом Винсент
источник
2
Это, кажется, единственный ответ, который действительно помогает ОП (и мне).
Безумный физик
Каков приоритетный порядок? Это просто вещи, определенные позже в файле, переопределяют вещи, определенные ранее в файле? Как, скажем, у меня было «Compression no» в «Host X01», будет ли это переопределено «Compression yes» в «Host X01 X02»?
Бен Фармер
1
Из руководства по ssh_config: поскольку используется первое полученное значение для каждого параметра, в начале файла должны быть даны более специфичные для хоста объявления, а общие значения по умолчанию - в конце.
Гийом Винсент
Можно Host X01 X02 ...заменить на *.YYY.com? Это кажется немного более управляемым, если это работает.
Майкл
51

Просто использовать *

Смотрите man ssh_config:

УЗОРЫ Шаблон состоит из нуля или более непробельных символов, '*' (подстановочный знак, который соответствует нулю или более символов) или '?' (подстановочный знак, который соответствует ровно одному символу). Например, чтобы указать набор объявлений для любого хоста в наборе доменов «.co.uk», можно использовать следующий шаблон:

       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"
Х.-Дирк Шмитт
источник
Спасибо! Кажется, это то, что мне нужно, но я все еще не понимаю, как адаптировать его к моему делу. Должен ли я использовать вопросительный знак ?там, где я хочу, чтобы он был заменен шаблоном, соответствующим *знаку?
Амелио Васкес-Рейна
2
Хм. Я думаю, что шаблоны служат другой цели, чем мне нужно. Они перенаправляют несколько запросов к одной и той же configзаписи, но параметры хоста являются фиксированными (то есть шаблоны не могут использоваться для шаблонирования параметров). Я ошибаюсь?
Амелио Васкес-Рейна
4
@ user27915816 Да, вы правы, насколько я знаю, нет способа делать "шаблоны". Лучшее, что вы можете сделать, - это выделить постоянные строки в одну Host *запись и иметь отдельную запись для каждой, Host XXXкоторая состоит только из частей, которые меняются (то есть Hostname XXX.YYY.ZZZстроки).
jw013
Эта страница является лучшим результатом (пока что) при поиске «подстановочных знаков ssh config», поэтому спасибо за ответ на этот вопрос.
18:00
9

Из ответов Игнасио Васкеса-Абрамса и Х.-Дирка Шмитта можно добавить следующее в .ssh / config

HOST XXX*
    HostName %h.YYY.com
    User myname

а затем, например, вы можете войти как myname@XXX2.YYY.com

ssh XXX2
Вито Чоу
источник
поскольку XXX * подразумевает уже XXX.YYY.com, HostName должен быть только %h, а не%h.YYY.com
biocyberman
8

это работает для меня:

CanonicalizeHostname да
CanonicalDomains xxx.auckland.ac.nz yyy.auckland.ac.nz

хост * .xxx.auckland.ac.nz
   пользователь myuser
хост * .yyy.auckland.ac.nz
   пользователь myuser

это позволяет использовать имена в домене и изменить имя пользователя:

bluebottle: ~ user_one $ ssh itslogprd05
Пароль myuser@itslogprd05.xxx.auckland.ac.nz: 
Рассел Фултон
источник
Это лучший ответ для меня. Я избавился от скрипта, который использовал для генерации моей конфигурации!
шутит
Что если itslogprd05хост существует в обоих доменах? xxx.auckland.ac.nzя думаю, победит?
Левенте Хушко