我偶然发现了这种行为,并想知道它是否是故意的和/或有记录的,因为我找不到任何东西。
我的 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
将后续配置指令限制到下一个Host
或Match
指令,因此 doesnotexist.nonexistanttld 没有特定设置,并且exec "touch do-not-touch"
将针对每个主机执行。
顺便说一下,这个问答也报告了同样的情况https://unix.stackexchange.com/q/734537