您可以有多个〜/ .ssh / config文件吗?


82

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

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

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


让每个用户使用自己的用户名登录到堡垒主机。另外,您将把什么放入每个主机需要一个条目的配置文件中?您不能设置一些常见的默认值吗?
杰德·丹尼尔斯

1
上superuser.com同样的问题:superuser.com/questions/247564/...
guettli

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

Answers:


51

~/.ssh/config文件没有包含其他文件的指令,可能与SSH的文件权限检查有关。

有关此问题的建议可以包括一个脚本,以在系统上或通过存储库上的签入挂钩一起汇总多个更改。人们可能还会研究诸如Puppet或Augeas之类的工具。

但是,无论采用哪种方法,都必须将单个文件从文件外部串联为单个文件。

$ cat ~/.ssh/config_* >> ~/.ssh/config

注意: 覆盖:> vs追加:>>

2017年12月更新:

从7.3p1开始,包含选项。它允许您包括配置文件。

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文件。我不知道这种解决方案有多干净,但是它确实可以解决问题,并且可以满足我的目的。
wrangler 2012年

52

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

ssh -F /path/to/configfile

看来这是唯一的方法。

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


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

36

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

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

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


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

2
只需在config文件顶部添加Include指令即可。我不知道为什么它不能在底部运行。
pylover

17

我个人使用这些命令来编译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)将是理想的。我也想出了这个,但是我遇到了同样的错误。有人知道这是什么问题吗?
病假,2016年

2
ssh检查文件权限,我认为这种重定向不支持该检查。
卡姆登·纳尔兹特

2

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

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


0

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

    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

然后将您现有的移动configconfig.inmake生成config


0

我一直在使用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
}

sshMakeConfig如果要确保每个Shell会话上都有新的配置,可以选择添加到run-config的底部

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.