在 ~/.ssh/config 中动态生成 SSH 主机条目

Ama*_*rus 10 ssh

我必须通过 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)

我知道您可以%hHostname参数中使用,但这将是主机名。我真正需要的是某种字符串替换,比如 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 连接。


Dan*_*ley 7

您不需要手动指定 HostName,因为它将来自命令行。

只需尝试:

Host *.domain  
  IdentityFile ~/.ssh/id_rsa  
  ProxyCommand ssh mygateway /usr/bin/nc %h 22
Run Code Online (Sandbox Code Playgroud)

  • 所以你实际上想要重新配置你的 DNS。最简单(但最麻烦的解决方案)是修改您的主机文件。另一方面,您可以始终使用 .invalid 域将本地 DNS 服务器添加到您的工作站,并使用您喜欢的主机名。 (2认同)

Ama*_*rus 0

看来没有任何办法可以做到这一点。