SSH 配置在目标主机名中使用主机的通配符部分

SSH 配置在目标主机名中使用主机的通配符部分

我正在尝试定义一个紧凑的 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...

相关内容