У меня есть куча серверов с именами 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
Это лучше, потому что это не требует повторного копирования всех параметров дважды.