我正在尝试定义一个紧凑的 SSH 配置,该配置不仅匹配 3 种主机命名方案,而且还匹配许多通配符可能性,所有这些都具有单一Host
定义,如下所示:
Host xyz-*.domain.com xyz-* xyz*
HostName xyz-%h.domain.com
User ubuntu
IdentityFile ~/.ssh/id_rsa
ProxyCommand nc -x proxy.company.com %h %p
这个想法是匹配所有这些主机,但只连接到完全限定的版本(以减少“ ”文件中的条目数known_hosts
):
xyz-dev.domain.com
=xyz-dev
=xyzdev
xyz-test.domain.com
=xyz-test
=xyztest
xyz-prod.domain.com
=xyz-prod
=xyzprod
- ETC。
我知道上述HostName
值不起作用,因为我正在尝试找到一种方法来执行“正则表达式捕获”中的各种Host
并在扩展中使用它HostName
。
通过使用一些更高级的配置语法,我设法想出了一种可读性更差的形式,除了仍然需要手动接受主机密钥或完全忽略它们(不理想)之外,它基本上可以工作,但仍然会自动将它们添加到“ known_hosts
”文件中。
Match exec "echo %h | grep -Eq '^xyz-?[^.]+(\.domain\.com|)$'"
User ubuntu
IdentityFile ~/.ssh/id_rsa
ProxyCommand nc -x proxy.company.com $(echo "%h" | sed -rn 's/^xyz-?([^.]+).*/xyz-\1/p').domain.com %p
# StrictHostKeyChecking no
HostName
有更好的方法吗?如果它本身允许与我使用的相同类型的 shell 操作,那就太好了ProxyCommand
,但我还没有看到任何证据。
答案1
我想说,最简单的选择是编写包装脚本。
如果您可以删除xyzfoo
而只保留xyz-foo
,那么就会简单得多 - 只需使用两个配置块,一个带有 %h,另一个不带有:
主机 xyz-*.domain.com 用户 ubuntu 身份文件 ~/.ssh/id_rsa ProxyCommand nc -x proxy.company.com %h %p 主机 xyz-* 主机名 %h.domain.com 用户 ubuntu 身份文件 ~/.ssh/id_rsa ProxyCommand nc -x proxy.company.com %h %p
在最近的 OpenSSH 版本中,您还可以使用两遍处理:
主机 xyz-*.domain.com 用户 ubuntu 身份文件 ~/.ssh/id_rsa ProxyCommand nc -x proxy.company.com %h %p 主机 xyz-* CanonicalizeHostname 是 CanonicalDomains domain.com # (没有其他的)
或者:
比赛决赛xyz-*.domain.com 用户 ubuntu 身份文件 ~/.ssh/id_rsa ProxyCommand nc -x proxy.company.com %h %p 主机 xyz-* 主机名 %h.domain.com # (没有其他的)
(这两者之间的实际区别在于“CanonicalizeHostname”会针对列表域,直到找到匹配项,使其适合Host *
;同时'%h'方法是完全静态的 - 速度更快,但限制每个模式只能有一个域。)
至于known_hosts条目,如果您手动管理文件(或从脚本生成文件),则可以将所有别名添加到同一个条目:
xyz-foo.domain.com,xyz-foo,xyzfoo ssh-ed25519 AAAAC3NzaC1lZ...
xyz-bar.domain.com,xyz-bar,xyzbar ssh-ed25519 AAAAC3NzaC1lZ...