我们有一个堡垒服务器,用于连接多个主机,而我们的 .ssh/config 已增长到一千多行(我们连接了数百个主机)。这开始变得有点难以处理,我想知道是否有办法将 .ssh/config 文件拆分为多个文件。理想情况下,我们会在某个地方指定其他文件将被视为 .ssh/config 文件,可能如下:
~/.ssh/config
~/.ssh/config_1
~/.ssh/config_2
~/.ssh/config_3
...
我已阅读 ssh/config 上的文档,但我认为这不可能。但也许其他人也遇到过类似的问题并找到了解决方案。
答案1
该~/.ssh/config
文件没有包含其他文件的指令,可能与 SSH 的文件权限检查有关。
对此的建议可以包括一个脚本,用于在系统上或通过存储库上的签入挂钩将多个更改放在一起。也可以研究 Puppet 或 Augeas 等工具。
但是,无论您如何处理它,您都必须将各个文件连接成文件外部的单个文件。
$ cat ~/.ssh/config_* >> ~/.ssh/config
笔记: 覆盖:>
对比附加:>>
2017 年 12 月更新:
从 7.3p1 开始,有 Include 选项。它允许您包含配置文件。
Include
Include the specified configuration file(s). Mul‐
tiple pathnames may be specified and each pathname
may contain glob(3) wildcards and, for user config‐
urations, shell-like “~” references to user home
directories. Files without absolute paths are
assumed to be in ~/.ssh if included in a user con‐
figuration file or /etc/ssh if included from the
system configuration file. Include directive may
appear inside a Match or Host block to perform con‐
ditional inclusion.
答案2
您可以像这样在 ssh 选项中指定要使用的当前配置文件:
ssh -F /path/to/configfile
看来这是唯一的办法。
而且,无法将一个配置包含到另一个配置中。
答案3
从 ssh 7.3(2016 年 8 月 1 日发布)开始,Include
可以使用一个指令。
包括:包含指定的配置文件。可以指定多个路径名,每个路径名可以包含 glob 通配符和类似 shell 的“~”引用,指向用户主目录。没有绝对路径的文件假定位于 中
~/.ssh
。Include
指令可以出现在Match
或Host
块内,以执行条件包含。
(这是已解决的错误报告的链接,其中也包含补丁:https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24)
答案4
我也会使用它cat config_* > config
来生成整个配置。但如果它们还没有到位,我不会使用 puppet/cfengine 等(顺便说一句:为什么不使用配置管理系统?)。
我会生成一个包(deb、rpm)并将其放在本地存储库中。在 postinst 脚本中,cat 会生成您的配置。也许您还会包含一个本地文件夹... 优点是,当 cron-apt &Co 运行时,ssh/config 更新会每天激活。