ssh 配置:如何级联配置

ssh 配置:如何级联配置

假设我有这个 ssh 配置文件:

host server1
  user myUser1
  hostname 192.168.0.1
host server2
  user myUser
  hostname 192.168.0.2
host 192.168.0.*
  # global config here (such as proxycommand, etc)

我怎样才能使全局配置应用于 server1 和 server2?

编辑:

我不想使用模式来解决这个问题,我希望最后一个“主机”条目检查以前的主机名。我认为有一个选项可以做到这一点,但我在文档中找不到它。

答案1

关键字Host与目标主机匹配;即命令行中给出的主机。因此,当使用以下文件时,ssh test-host将连接192.168.0.1当前用户名(即:忽略特定于 IP 的配置) - 因为test-host不匹配192.168.0.1

Host test-host
    Hostname 192.168.0.1

Host 192.168.0.1
    User test-user

为了使上述操作按预期工作,您必须CanonicalizeHostname=yes在配置文件中进行设置。这可以放在全局部分(顶部),也可以按主机设置,例如:

Host test-host
    Hostname 192.168.0.1
    CanonicalizeHostname yes

Host 192.168.0.1
    User test-user

这将导致test-host被重写192.168.0.1

请注意ProxyCommand具有特殊语义:

CanonicalizeHostname

控制是否执行显式主机名规范化。默认为no,不执行任何名称重写,并让系统解析器处理所有主机名查找。如果设置为yes,则对于不使用的连接ProxyCommand,将尝试使用后缀和规则ssh(1)规范化命令行中指定的主机名。 CanonicalDomainsCanonicalizePermittedCNAMEs如果CanonicalizeHostname设置为always,那么规范化也将应用于代理连接。

如果启用此选项,则使用新的目标名称再次处理配置文件,以获取匹配HostMatch节中的任何新配置。


实现您所追求的行为的替代方法如下:

A

host server1
  user myUser1
  hostname 192.168.0.1

host server2
  user myUser
  hostname 192.168.0.2

host server1 server2
  # global config here (such as proxycommand, etc)

host 192.168.0.1
  user myUser1

host 192.168.0.2
  user myUser

host 192.168.0.*
  # global config here (such as proxycommand, etc)

答案2

正如您已经展示的,您可以向配置文件中添加一个Host *或甚至一个Host server*节,它将应用于与(有限)正则表达式匹配的所有主机。例如

Host *
  ProxyCommand ...

还有?匹配单个字符的模式,例如:

Host server?
  ...

您还可以应用于多个主机,以空格分隔,例如:

Host crypto cryptonomicon crypto.example.com
  HostName crypto.example.com
  HostKeyAlias crypto
  User me

FWIW,所有这些都在ssh_config手册页- 查找标题为“模式”的部分

相关内容