正则expression式匹配在sshconfiguration

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

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

我不想把50个configuration项放到我的.ssh / config中,比如

 HOST srv1 HOSTNAME srv1.domain.com USER amac IdentityFile /home/amac/.ssh/id_rsa 

我喜欢的是一个正则expression式匹配,这将允许我写类似的东西

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

这可能吗? 也许通过创build一个bash别名,将所有“srv(。*)”的实例转换为srv \ 1.domain.com,其中\ 1对应于由正则expression式匹配的palent中的子string?

谢谢。

这听起来像是DNS最好解决的问题。 把这个添加到你的/etc/resolv.conf

 search domain.com 

如果DNS查找不包含点1或返回NXDOMAIN响应,则将使用该search值追加另一个DNS查找。

例子:

如果您执行ssh srv1 ,DNS查找将为srv1.domain.com

如果您执行ssh srv1.dc1 ,则DNS查找将是srv1.dc1 ,它将返回NXDOMAIN。 自动跟踪DNS查找将用于srv1.dc1.domain.com

您可以将多个search域添加到以空格分隔的行中,并按列出的顺序尝试,直到其中一个返回Alogging2

1.)该值是可configuration的,指的是短名称必须less于的点数。 默认值为1,对于主机为srv1.dc1.domain.comforms的站点,它应该设置为高于1。 这样可以避免向dc1顶级域的根服务器发送无用的请求。

2.)或者AAAAlogging。

这应该在OpenSSH 5.5及更高版本上做到这一点。

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

第一条规则匹配任何正常的域名,只是通过域名。 第二个规则处理单个单词主机并将domain.com追加到最后。

这样做的一个副作用是,即使ssh调用anotherdomain.com,ssh也会尝试使用IdentityFile for domain.com。 但是我不认为这个问题很重要。

openssh支持模式(请参阅http://linux.die.net/man/5/ssh_config ),但没有引用匹配(AFAIK)。

您可以像在问题中那样指定通配符:

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

如果你不想指定完整的主机名,你可以使用前面提到的dns技巧(并将主机行改为srv *),或者创build一个shell函数,如下所示:

 ss() { if [ -z "$1" ]; then echo "specify a server #, eg ss 10" else echo "ssh'ing to srv$1.domain.com" ssh srv$1.domain.com fi } 

并使用它像:

 ss 10 

比改变DNS更容易,并且当你想打srv01.someotherdomain.com时不会造成问题。

您可以使用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