忽略直接通过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
希望这可以帮助!