我想根据某些条件设置具有不同配置的 ssh 连接。别名中的许多参数是相同的。有没有办法避免在每个别名中重复它们?
下面的例子中,x 是变量,也是y = 1
常量。理想情况下,y 应该被定义一次。
Match host foo exec c1
x = 1
y = 1
Match host foo exec c2
x = 2
y = 1
# Some more `Match host foo` for foo on different conditions
Host foo
x = 42
y = 1
答案1
在您发布的示例中,您可以放置
Host foo
y = 1
在整个代码片段之前。请参阅SSH 配置中的主机配置是否合并?您仍然可以Host foo
在末尾添加,以x = 42
表示未由所有先前内容定义的情况x
。重点是使用第一个相关出现的情况。
那么,将使用第一个相关事件,除非在手动的。我们不知道您的y
是什么。如果y
是可以指定多个值的参数,则“第一个获胜”规则不适用。
我认为该规则适用于y
。在您发布的示例中,y = 1
从除 under 之外的所有位置删除Host foo
也应该有效。我的意思是,如果没有Match host foo exec …
定义y
,则放置y = 1
在 underHost foo
将是 的第一个相关事件foo
,无论它放置在其他部分之前、之间还是之后Match
。
一个有用的一般提示是:
不要将
Host
/Match
视为单独的“部分”,一般来说,将其视为一个大型配置,其中一些设置已过滤。
(归功于这个答案。
如果你真的y = 1
在配置的许多地方都需要(可能是因为y
“先到先得”的参数不适用,因此上述部分答案没有帮助),将此行放在单独的常规文件中,并将Include
该文件放在所有地方的主配置中。
Include
包含指定的配置文件。可以指定多个路径名,每个路径名可以包含glob(7)
通配符,对于用户配置,还可以包含对用户主目录的类似 shell 的引用。通配符将按词汇顺序展开和处理。如果文件包含在用户配置文件中或包含在系统配置文件中,~
则假定没有绝对路径的文件在。Include指令可以出现在或块内以执行条件包含。~/.ssh
/etc/ssh
Match
Host
(来源:man 5 ssh_config
。
例子:
Match host foo exec c1
x = 1
Include default-y
Match host foo exec c2
x = 2
Include default-y
# Some more `Match host foo` for foo on different conditions
Host foo
x = 42
Include default-y
其中default-y
是~/.ssh/default-y
或/etc/ssh/default-y
,取决于代码片段是在用户配置文件中(如~/.ssh/config
)还是在全局配置文件中(如/etc/ssh/ssh_config
)。