Мне нужно управлять целой кучей хостов по ssh. Однако я могу получить к ним доступ только через определенный SSH-сервер шлюза.
У меня в моем ~/.ssh/config
:
Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22
Однако мне приходится подключаться ко многим из этих машин. Вместо того, чтобы помещать десятки записей в мои ~/.ssh/config
, есть ли у меня что-то вроде этого:
Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22
Я знаю, ты можешь использовать %h
в Hostname
аргумент, но это будет имя хоста. Что мне действительно нужно, так это какая-то подстановка строк, например, bash ${VAR%thingie}
. Это возможно?
Это можно сделать с помощью следующего файла конфигурации SSH:
Host *
ServerAliveInterval 120
Host gateway.somewhere.com
User jdoe
Host gateway+*
User jdoe
ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null
ControlMaster auto
ControlPath ~/.ssh/ssh-control_%r@%h:%p
Затем вы получаете доступ к своим внутренним хостам следующим образом:
ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com
Имя, которое вы выбираете для правой половины, должно разрешаться хостом перехода.
Параметр User указывается в случае, если вам необходимо вручную сопоставить разных пользователей на разных классах хостов. ControlMaster и ControlPath указаны для повторного использования SSH-соединения.
Вам не нужно вручную указывать HostName, так как оно берется из командной строки.
Просто попробуйте:
Host *.domain
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway /usr/bin/nc %h 22
Похоже, это никак нельзя сделать.
У меня была аналогичная проблема, и в итоге я написал сценарий, который сгенерировал для меня все шаблоны. Я больше не меняю ~ / ssh / config, я меняю ~ / ssh / config.in и перезапускаю свой скрипт.
Игнорируйте указание переопределения имени хоста напрямую через Hostname
объявление и вместо этого определить его во время выполнения. Сделайте это, оценив его как часть ProxyCommand
, с помощью %h
для ссылки на него в команде (также используйте %p
вместо порта жесткого кодирования как 22), т.е.
Host mygateway-*
#Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc $(echo %h|sed 's/^mygateway-//') %p
Можно даже иметь более общую строфу, в которой вы можете указать любой хост без -
обрабатываться как есть или в соответствии с другими подходящими строфами, но иметь общий -
подход к уточнению любых <gateway>-<target>
:
Host *-*
# Assume LHS of "-" is GW and RHS of "-" is target host
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh $(echo %h|cut -d - -f1) nc $(echo %h|cut -d - -f2-) %p
Кроме того, более новые версии клиента SSH поддерживают [-W host:port]
возможность напрямую выполнять ту же функцию, что и nc
(netcat). Таким образом, мы можем использовать модифицированные:
Host *-*
# Assume LHS of "-" is GW and RHS of "-" is target host
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -W $(echo %h|cut -d - -f2-):%p $(echo %h|cut -d - -f1)
Конечно, если у вас есть ограниченный список хостов, вы всегда можете:
Host host1 host2 host3 hostN
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h %p
Надеюсь это поможет!
У меня был клиент с такой же настройкой, и я использовал ДСШ чтобы решить мою проблему.
DSSH, помимо прочего, позволяет прозрачно входить в систему на удаленных хостах через хост-шлюз.
Случаи использования