ssh 配置中的正则表达式匹配

Rug*_*man 2 ssh configuration bash regular-expressions

我有一堆名称为 srv1.domain.com、srv2.domain.com、...、srv50.domain.com 的服务器

我希望能够通过以下方式连接到这些服务器 ssh srv1

我不想将 50 个配置条目放到我的 .ssh/config 中,例如

HOST srv1
HOSTNAME srv1.domain.com
USER amac
IdentityFile /home/amac/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

我喜欢的是正则表达式匹配,它允许我写一些类似的东西

HOSTNAME (srv[0-9]*).domain.com
HOST \1
USER amac
IdentityFile /home/amac/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

这可能吗?也许通过创建一个 bash 别名将“srv(.*)”的所有实例转换为 srv\1.domain.com,其中 \1 对应于正则表达式匹配的括号中的子字符串?

谢谢。

小智 5

这应该在 OpenSSH 5.5 及更高版本上起作用。

Host *.*
  Hostname %h

Host *
  Hostname %h.domain.com
  IdentityFile /path/to/keyfile.pem
Run Code Online (Sandbox Code Playgroud)

第一条规则匹配任何普通域名,并且只传递域名。第二条规则处理单个单词 hosts 并将 domain.com 附加到末尾。

这样做的一个副作用是,即使是对 anotherdomain.com 的 ssh 调用,ssh 也会尝试将 IdentityFile 用于 domain.com。然而,我认为这并不重要。


小智 5

您可以使用ProxyCommandregex命令行上指定的主机名。

Host srv*.domain.com
    User amac
    ProxyCommand nc $(sed -e "s/.domain.com//" <<< "%h") %p
    IdentityFile /home/amac/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

现在ssh srv23.domain.com将连接到srv23.

请注意,您不需要指定HostName.