我有一组服务器,名称分别为 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
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
这样更好,因为它不需要复制所有选项两次。