Назад | Перейти на главную страницу

Соответствие регулярных выражений в конфигурации ssh

У меня есть куча серверов с именами srv1.domain.com, srv2.domain.com, ..., srv50.domain.com

Я хочу иметь возможность подключаться к этим серверам через ssh srv1

Я не хочу помещать 50 записей конфигурации в мой .ssh / config, например

HOST srv1
HOSTNAME srv1.domain.com
USER amac
IdentityFile /home/amac/.ssh/id_rsa

Что мне нравится, так это сопоставление регулярных выражений, которое позволило бы мне написать что-то вроде

HOSTNAME (srv[0-9]*).domain.com
HOST \1
USER amac
IdentityFile /home/amac/.ssh/id_rsa

Это возможно? Может быть, создав псевдоним bash, который преобразует все экземпляры "srv (. *)" В srv \ 1.domain.com, где \ 1 соответствует подстроке в парантезисе, соответствующей регулярному выражению?

Спасибо.

Это должно помочь в OpenSSH 5.5 и выше.

Host *.*
  Hostname %h

Host *
  Hostname %h.domain.com
  IdentityFile /path/to/keyfile.pem

Первое правило соответствует любым нормальным доменным именам и просто передает доменное имя. Второе правило обрабатывает хосты из одного слова и добавляет domain.com в конец.

Одним из побочных эффектов этого является то, что даже для ssh-вызовов anotherdomain.com ssh будет пытаться использовать IdentityFile для domain.com. Однако я не думаю, что это важно.

Ты можешь использовать ProxyCommand использовать regex на имени хоста, указанном в командной строке.

Host srv*.domain.com
    User amac
    ProxyCommand nc $(sed -e "s/.domain.com//" <<< "%h") %p
    IdentityFile /home/amac/.ssh/id_rsa

Сейчас ssh srv23.domain.com подключится к srv23.

Обратите внимание, вам не нужно указывать HostName.

Похоже, проблему лучше всего решает DNS. Добавьте это в свой /etc/resolv.conf:

search domain.com

Если поиск в DNS не содержит точек1 или возвращает ответ NXDOMAIN, тогда будет выполнен другой поиск DNS с добавленным значением поиска.

Примеры:

Если вы это сделаете ssh srv1, поиск DNS будет выполнен для srv1.domain.com.

Если вы это сделаете ssh srv1.dc1, поиск DNS будет для srv1.dc1 который вернет NXDOMAIN. Автоматический последующий поиск DNS будет для srv1.dc1.domain.com.

Вы можете добавить несколько доменов поиска в эту строку, разделенных пробелом, и они будут проверяться в указанном порядке, пока один из них не вернет запись A.2.

1.) Это значение настраивается и относится к количеству точек, которое должно быть меньше чем краткое имя. Значение по умолчанию - 1, и оно должно быть больше 1 для сайтов, на которых хосты имеют вид srv1.dc1.domain.com. Это позволяет избежать бесполезных запросов к корневым серверам для dc1 домен верхнего уровня.

2.) Или запись AAAA.

openssh поддерживает шаблоны (см. http://linux.die.net/man/5/ssh_config), но не ссылки на совпадения (AFAIK).

Вы можете указать подстановочные знаки почти так же, как в вопросе:

Host srv*.domain.com
  User amac
  IdentityFile /home/amac/.ssh/id_rsa

Если вы не хотите указывать полное имя хоста, вы можете либо выполнить описанный ранее трюк с DNS (и изменить строку Host на srv *), либо создать функцию оболочки следующим образом:

ss() {
  if [ -z "$1" ]; then
    echo "specify a server #, eg ss 10"
  else
    echo "ssh'ing to srv$1.domain.com"
    ssh srv$1.domain.com
  fi
}

и используйте его как:

ss 10

Это проще, чем изменение DNS, и это не вызывает проблем, когда вы хотите попасть на srv01.someotherdomain.com.

У меня возникла проблема, что при указании

Host srv*
  Hostname %h.domain.com

Я больше не мог подключиться с использованием полных имен хостов:

$ ssh srv677.domain.com
ssh: Could not resolve hostname srv677.domain.com.domain.com: Name or service not known

Обратите внимание, что удвоение domain.com.

Чтобы иметь возможность подключаться как через короткие, так и через полные имена хостов, я проделал следующий трюк:

Host srv* !srv*.domain.com
    Hostname %h.domain.com
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

Host srv*.domain.com
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

Или даже лучшее решение (вдохновленное этим ответом https://superuser.com/a/469470):

Host *.domain.com srv* vrs*
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

Host !*.domain.com srv* vrs*
    Hostname %h.domain.com

Это лучше, потому что это не требует повторного копирования всех параметров дважды.