我们有一个堡垒服务器,可用于连接到多个主机,并且.ssh / config已增长到一千多行(我们有数百个要连接的主机)。这开始变得有点笨拙,我想知道是否有一种方法可以将.ssh / config文件分解为多个文件。理想情况下,我们会在其他地方指定将其他文件视为.ssh / config文件,例如:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...


我已经阅读了ssh / config的文档,但我认为这是不可能的。但是也许其他人也遇到了类似的问题并找到了解决方案。

评论

让每个用户使用自己的用户名登录到堡垒主机。另外,您要放入需要每个主机一个条目的配置文件中吗?您不能设置一些常见的默认设置吗?

关于superuser.com的相同问题:superuser.com/questions/247564/…

很快,在OpenSSH 7.3中应该可以了。 bugzilla.mindrot.org/show_bug.cgi?id=1585#c25

#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.
 


评论


谢谢杰夫,这是一个好主意。我对Puppet或Augeas不太了解,因此为了使事情尽可能简单,您的解决方案似乎是最好的。我可以将配置分解为多个配置,并创建一个简单的脚本以在每修改一个文件时重新创建.ssh / config文件。我不知道这种解决方案有多干净,但是它确实可以解决问题,并且可以满足我的目的。

–牧马人
2012年3月31日在18:19

#2 楼

您可以像这样在ssh选项中指定要使用的当前配置文件:

ssh -F /path/to/configfile


这似乎是唯一的方法。

也没有办法将一个配置包含到另一个配置中。

评论


使用Perl的Net :: OpenSSH模块(例如,用于多个私钥文件)时,有一个不错的选择,该模块不能提供所有可能。

–吉米·科廷(Jimmy Koerting)
16-10-1在15:48

#3 楼

从ssh 7.3(2016年8月1日发布)开始,可以使用Include伪指令。


包括:包括指定的配置文件。可以指定多个路径名,每个路径名都可以包含glob
通配符和对用户主目录的类似于shell的“〜”引用。
假定没有绝对路径的文件位于~/.ssh中。
Include指令可能出现在MatchHost块内,以执行条件包含。


(此处是已解决的错误报告的链接,其中还包括补丁:https://bugzilla.mindrot.org/show_bug.cgi?id = 1585#c24)

评论


太酷了期待这个。它最终应该以正确的方式解决这个问题:)

–牧马人
16年7月12日在16:40

只需在配置文件顶部添加Include指令。我不知道为什么它不能在底部运行。

– pylover
18年9月28日在7:00

#4 楼

我个人使用这些命令来编译ssh配置:

alias compile-ssh-config='echo -n > ~/.ssh/config && cat ~/.ssh/*.config > ~/.ssh/config'
alias ssh='compile-ssh-config && ssh'
# (This will get used by other programs depending on the ~/.ssh/config)
# (If you need you can run the compile-ssh-config command via cron etc.)


或:

alias compile-ssh-config='echo -n > ~/.ssh/config-compilation && cat ~/.ssh/*.config > ~/.ssh/config-compilation'
alias ssh='compile-ssh-config && ssh -F ~/.ssh/config-compilation'
# (This is saver and won't over write an existing ~/.ssh/config file)


因为:

alias ssh='ssh -F <(cat .ssh/*.config)'


不适用于我,返回:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor


希望对您有帮助。

评论


ssh -F <(cat .ssh / *。config)是理想的。我也想出了这个,但是我遇到了同样的错误。有人知道这是什么问题吗?

–生病
16-4-7在13:41



ssh检查文件权限,我认为这种重定向不支持该检查。

–卡姆登·纳尔兹(Camden Narzt)
16 Sep 25 '16:42

#5 楼

我也将使用cat config_* > config来生成整个配置。
但如果它们还没有到位,我就不会使用puppet / cfengine等(顺便说一句:为什么不使用配置管理系统?) 。

我会生成一个程序包(deb,rpm)并将其放在本地存储库中。然后在postinst脚本中,猫生成您的配置。也许您还包括一个本地文件夹...
优点是,在cron-apt&Co运行时,每天都会激活ssh / config更新。

#6 楼

您应该在〜/ .ssh / config文件中的所有Host标记之上使用Include选项。
否则ssh不会重新整理您的Includes。
Include〜/ .ssh / config- *
主机隧道
主机名数据库.example.com
....

#7 楼

您可以在~/.ssh中使用Makefile:

    config: config.in config.app.in
        > $@
        (for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@

    config.app.in:
        (echo "# Generated with foobar.sh."; \
            foobar.sh) > $@
    .PHONY: config.app.in


,然后将现有的config移至config.in并运行make来生成config

#8 楼

我一直在使用config.d目录的概念进行配置组织。因此,除了上面的选项之外,这就是为我工作的东西。

目录结构类似于

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish


构建〜/ .ssh / config并存在于我的shell的run-config中的函数如下所示

sshMakeConfig() {
    echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
    for i in ~/.ssh/config.d/*
        do echo "#${i}" | tee -a ~/.ssh/config
        cat ${i} >> ~/.ssh/config
    done
}


如果要确保每个Shell会话上都有新的配置,则可以选择在运行配置的底部添加sshMakeConfig

每当我需要重新编译〜/ .ssh / config时,都可以通过以某种形式运行sshMakeConfig(直接,获取我的run-config或启动新的shell)来实现