SSH 从有条件排除的包含中执行“Match exec”行

SSH 从有条件排除的包含中执行“Match exec”行

我偶然发现了这种行为,并想知道它是否是故意的和/或有记录的,因为我找不到任何东西。

我的 ssh 版本的手册页针对ssh_config/说明Include

Include 指令可能出现在 Match 或 Host 块内以执行条件包含。

给定以下文件:

# ~/.ssh/config

Host doesnotexist.nonexistanttld
  Include ~/.ssh/inc
# ~/.ssh/inc
Match host * exec "touch do-not-touch"

我可以观察到这一点:

$ ssh foo
ssh: Could not resolve hostname foo: nodename nor servname provided, or not known
$ ls
do-not-touch

原因似乎是这样的:

debug3: $HOME/.ssh/config line 2: Including file $HOME/.ssh/inc depth 0 (parse only)
debug2: checking match for 'host * exec "touch do-not-touch"' [...]

(注意parse only

我不希望发生这种情况。那么,这是故意的吗?与仅读取、解析和执行实际包含的文件中匹配项相比,这样做有什么充分的理由吗?

答案1

我假设,与许多其他配置文件语法一样,指令Include和您的Include ~/.ssh/inc实际上并不是 100% 有条件的(尽管您的缩进和手册)。而是配置解析器首先将所有(嵌套的)配置片段包含到单个有效配置中(有效地用Include file_name的内容替换行file_name),然后才评估合并的配置文件。

您的示例的合并结果将是

Host doesnotexist.nonexistanttld
Match host * exec "touch do-not-touch"

指令Host将后续配置指令限制到下一个HostMatch指令,因此 doesnotexist.nonexistanttld 没有特定设置,并且exec "touch do-not-touch"将针对每个主机执行。

顺便说一下,这个问答也报告了同样的情况https://unix.stackexchange.com/q/734537

相关内容