![在 ssh 配置中,“匹配规范全部”是什么意思?](https://linux22.com/image/218730/%E5%9C%A8%20ssh%20%E9%85%8D%E7%BD%AE%E4%B8%AD%EF%BC%8C%E2%80%9C%E5%8C%B9%E9%85%8D%E8%A7%84%E8%8C%83%E5%85%A8%E9%83%A8%E2%80%9D%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%EF%BC%9F.png)
我想CanonicalizeHostname
在我的 ssh 配置中使用它,这样就可以添加和删除主机,而无需编辑文件。
Host bastion
ProxyJump none
Match canonical
ProxyJump bastion
ForwardAgent yes
Host *
ForwardAgent no
CanonicalizeHostname always
CanonicalDomains mydomain.co.uk
CanonicalizeMaxDots 0
CanonicalizeFallbackLocal yes
ssh-agent 没有被转发到我的任何服务器。如果我将ForwardAgent
其更改Host *
为“是”,那么它将被转发。因为ForwardAgent
下面Match canonical
没有被解析,所以我认为存在错误,并向 OpenSSH 做了报告(该报告已被删除)。
有人向我解释说它正在按预期工作:
启用主机名规范化后,配置将被解析两次。初始阶段收集选项,然后在主机名最终确定后进行第二阶段。大多数配置选项都是“首场比赛获胜”
所以这里发生的事情是,在第一次传递时,您的“Host *”块正在被解析,并且 ForwardAgent 选项被设置为“no”。在后续传递中,“Match canonical”块中的 ForwardAgent 指令将被忽略,因为它已经设置。
我能理解。我知道它被解析了两次并CanonicalizeHostname
启用了,但我没有意识到这样做的结果。
我不明白的是避免这种情况的方法“仅在最后一次设置后备 ForwardAgent”:
Host bastion
ProxyJump none
Match canonical
ProxyJump bastion
ForwardAgent yes
Match all
CanonicalizeHostname always
CanonicalDomains mydomain.co.uk
CanonicalizeMaxDots 0
CanonicalizeFallbackLocal yes
Match canonical all
ForwardAgent no
我的问题:
与有何
Match All
不同Host *
?这是什么
Match canonical all
意思?当已经以不同的方式为规范主机设置了该选项时,为什么会指示规范主机再次解析该选项?如果是的话,!canonical
这对我来说会更有意义,尽管看起来是多余的,因为在这种情况下,它下面的单个指令已经被设置了。
我还有很多其他选项要添加,这些选项大部分都在下面Host *
并且与 无关CanonicalizeHostname
,所以我将它们遗漏了,但现在我不知道将它们放在哪里。
答案1
您可以创建仅适用于特定主机子集的配置块。 Match all 块匹配所有主机,相当于 Host *。
Match Canonical All 块适用于所有已进行规范化的主机。
使用 Match canonical all 而不是 Match !canonical 可确保配置选项仅应用于已进行规范化的主机,而不应用于已指定显式主机名的主机。
默认为全部匹配。如果您想在所有主机上应用选项,无论是否进行规范化,请选择该选项。如果您只想将其应用于进行规范化的主机,请在下面创建额外的匹配块,指定您的选项允许的内容
ssh 客户端连接到主机并确定第一个匹配的配置文件。如果有多个匹配文件,则第一个匹配的 Host 或 Match 块中的选项优先。
为了使 CanonicalizeHostname 选项正常工作,您必须启用双通解析模式。在每次解析过程中,都会针对配置文件中的每个主机名评估过滤器和匹配块。首先评估过滤器,然后评估匹配块。
您可以根据匹配块的预期范围向其添加选项。如果该选项适用于所有主机,请将其放置在全部匹配下。如果它仅适用于已进行规范化的主机,请使用这些选项创建一个新的 Match 块并相应地应用它们。
资料来源:
主持人 将以下声明(直到下一个 Host 或 Match 关键字)限制为仅适用于与关键字后给定的模式之一匹配的主机。如果提供了多个模式,则应使用空格分隔它们。单个“*”作为模式可用于为所有主机提供全局默认值。主机通常是命令行上给出的主机名参数(有关例外情况,请参阅 CanonicalizeHostname 关键字)。可以通过在模式条目前加上感叹号(“!”)来否定模式条目。如果匹配否定条目,则忽略主机条目,无论该行上的任何其他模式是否匹配。因此,否定匹配对于提供通配符匹配的例外很有用。有关模式的更多信息,请参阅模式。
例子:
# Match on hostname
Match Host example.com
# Match ip
Match Address 192.168.178.*
# Match on user
Match User alice
# Match based on group
Match Group admin
# Multiple criteria
Match Host example.com User alice
# Match multiple criteria, use this key for some hosts
Match canonical,Host host.domain.cocom,192.168.178.100
IdentityFile ~/.ssh/my_key
# Match multiple criteria, disable port forwarding for some hosts
Match canonical,Host *.domain.com,*.internal,192.168.178.*
ForwardAgent no
ForwardX11 no
CanonicalizeHostname yes
CanonicalDomains example.org example.com
CanonicalizeMaxDots 1
CanonicalizeFallbackLocal yes
CanonicalizePermittedCNAMEs *.redis.example.org:redis.example.com
Match All 与 Host * 有何不同?
Host * 匹配所有主机,因此后面的配置指令将应用于所有主机。主机名可以出现在您使用的模式中的任何位置(作为模式本身的一部分,或者出现在星号后面)。
“Match All”关键字用于对适用于特定主机的所有配置指令进行分组。当您使用“Match All”时,您不需要指定模式,因为它默认会匹配所有主机。
例子:
Host *
<config directives>
Host *
StrictHostKeyChecking no
Match All
<config directives>
Match All
Compression yes
匹配规范全部是什么意思?当已经以不同的方式为规范主机设置了该选项时,为什么会指示规范主机再次解析该选项?如果它是 !canonical,它对我来说会更有意义,尽管看起来是多余的,因为在这种情况下,它下面的单个指令已经被设置了。
Match canonical all 是一个配置选项,适用于所有规范主机,这些主机的名称可以通过 DNS 域名搜索算法完全限定。 SSH 中的“canonical”关键字意味着主机名必须是完全限定的,而不是主机名的别名或缩写版本。关于问题的第二部分,如果使用特定指令为主机设置配置选项,并且该主机与具有相同选项的“匹配”块相匹配
“Match canonical all”适用于所有规范主机,如果主机同时匹配特定指令和具有相同选项的“Match”块,则“Match”块优先。这 ”!” “!canonical”中的意思是“不规范”。因此,“Match !canonical”适用于无法通过 DNS 域名搜索算法完全限定的非规范主机
规范主机匹配选项可以在每个主机的基础上使用。如果主机在 DNS 区域文件中列出、具有使用 iproute2 配置的地址并在同一网络设备的接口之间路由数据包,则该主机匹配。如果主机不满足这些条件,则它不符合规范
在 SSH 中启用 CanonicalizeHostname 选项时,远程主机的主机名将被解析两次:第一次是在建立连接时,第二次是当 SSH 客户端应用具有 CanonicalizeHostname 指令的任何 Match 块时。如果您有一个包含适用于规范主机的 CanonicalizeHostname 指令的 Match 块,则该主机的名称将被解析两次,并且 Match 块中的配置选项将优先于之前设置的任何特定指令。