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

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

我有一组服务器,名称分别为 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

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

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

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

谢谢。

答案1

这听起来像是 DNS 能最好地解决的问题。将其添加到您的/etc/resolv.conf

search domain.com

如果 DNS 查找不包含点1或返回 NXDOMAIN >响应,则将进行另一个 DNS 查找并附加该搜索值。

例子:

如果 你 这样 做ssh srv1, DNS 查找 将 作出srv1.domain.com.

如果您执行了ssh srv1.dc1,DNS 查找将针对srv1.dc1,并返回 NXDOMAIN。自动后续 DNS 查找将针对srv1.dc1.domain.com

您可以向该行添加多个搜索域(以空格分隔),并且将按照列出的顺序尝试它们,直到其中一个返回 A 记录2

1.) 此值是可配置的,指的是短名称必须少于的点数。默认值为 1,对于主机形式为 的站点,应将其设置为大于 1。这可避免向根服务器发送无用的顶级域名srv1.dc1.domain.com请求。dc1

2.) 或者 AAAA 记录。

2020 年 11 月 25 日更新答案:

虽然上述过时的答案仍然是完全有效的,但现在我宁愿建议使用ssh_config内置机制CanonicalDomains

这意味着,/etc/resolv.conf您无需更改 DNS 记录,只需将以下几行添加到文件顶部即可ssh_config

CanonicalizeHostname yes
CanonicalDomains domain.com

请参阅官方 ssh_config 文档有关这些配置语句的详细信息。

答案2

这应该可以解决 OpenSSH 5.5 及更高版本的问题。

Host *.*
  Hostname %h

Host *
  Hostname %h.domain.com
  IdentityFile /path/to/keyfile.pem

第一条规则匹配任何普通域名,并直接让域名通过。第二条规则处理单词 hosts,并将 domain.com 附加到末尾。

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

答案3

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

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

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

请注意,您不需要指定HostName

答案4

我遇到了一个问题,在指定

Host srv*
  Hostname %h.domain.com

我无法再使用完整主机名进行连接:

$ ssh srv677.domain.com
ssh: Could not resolve hostname srv677.domain.com.domain.com: Name or service not known

请注意将 domain.com 加倍。

为了能够通过主机名的短形式和完整形式进行连接,我采用了以下技巧:

Host srv* !srv*.domain.com
    Hostname %h.domain.com
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

Host srv*.domain.com
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

或者更好的解决方案(受此答案启发https://superuser.com/a/469470):

Host *.domain.com srv* vrs*
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

Host !*.domain.com srv* vrs*
    Hostname %h.domain.com

这样更好,因为它不需要复制所有选项两次。

相关内容