Ігноруйте вказівку переопределення імені хоста безпосередньо через 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
Сподіваюся, це допомагає!