~/.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.
评论
谢谢杰夫,这是一个好主意。我对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
指令可能出现在Match
或Host
块内,以执行条件包含。(此处是已解决的错误报告的链接,其中还包括补丁: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)来实现
评论
让每个用户使用自己的用户名登录到堡垒主机。另外,您要放入需要每个主机一个条目的配置文件中吗?您不能设置一些常见的默认设置吗?关于superuser.com的相同问题:superuser.com/questions/247564/…
很快,在OpenSSH 7.3中应该可以了。 bugzilla.mindrot.org/show_bug.cgi?id=1585#c25