假设我有这个 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)
规范化命令行中指定的主机名。CanonicalDomains
CanonicalizePermittedCNAMEs
如果CanonicalizeHostname
设置为always
,那么规范化也将应用于代理连接。如果启用此选项,则使用新的目标名称再次处理配置文件,以获取匹配
Host
和Match
节中的任何新配置。
实现您所追求的行为的替代方法如下:
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
手册页- 查找标题为“模式”的部分