我必须通过 ssh 管理一大堆主机。但是我只能通过某个网关 ssh 服务器访问它们。
我有以下内容~/.ssh/config
:
Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22
Run Code Online (Sandbox Code Playgroud)
但是我必须连接到很多这些机器。不是在 my 中放入数十个条目~/.ssh/config
,而是无论如何我可以拥有这样的东西:
Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22
Run Code Online (Sandbox Code Playgroud)
我知道您可以%h
在Hostname
参数中使用,但这将是主机名。我真正需要的是某种字符串替换,比如 bash 的${VAR%thingie}
. 这可能吗?
小智 25
这可以通过以下 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
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样访问内部主机:
ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com
Run Code Online (Sandbox Code Playgroud)
您为右半部分选择的名称应该可由跳转主机解析。
如果您需要手动映射到不同类别主机上的不同用户,则指定 User 参数。指定 ControlMaster 和 ControlPath 以允许重新使用 SSH 连接。
您不需要手动指定 HostName,因为它将来自命令行。
只需尝试:
Host *.domain
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway /usr/bin/nc %h 22
Run Code Online (Sandbox Code Playgroud)