我必须通过 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}
。这可能吗?
答案1
可以使用以下 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 连接。
答案2
您不需要手动指定 HostName,因为它来自命令行。
只需尝试:
Host *.domain
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway /usr/bin/nc %h 22
答案3
忽略通过声明直接指定覆盖主机名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]
直接执行与(netcat)相同功能的选项nc
。因此,我们可以使用修改后的:
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
希望这可以帮助!
答案4
看起来好像没有办法做到这一点。