我有一堆名称为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.com
forms的站点,它应该设置为高于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
。