如果重要的话:


操作系统:Ubuntu 10.04
SSH:OpenSSH_5.3p1 Debian-3ubuntu5

我想要一个SSH配置文件包括另一个。用例是在默认的.ssh/config文件中定义所需的内容,然后在一个单独的文件中预先添加一些其他内容(例如~/.ssh/foo.config)。不过,我希望第二个文件包含第一个文件,因此我不必重复第一个文件中的所有内容。那可行吗?谢谢!

评论

关于serverfault的相同问题:serverfault.com/questions/375525/…

#1 楼

从7.3p1开始,有Include关键字
,它允许您包含配置文件。


Include

包含指定的配置文件(s)。
可以指定多个路径名,每个路径名
可以包含glob(3)通配符,对于用户配置,
对用户主目录的类似于shell的“〜”引用。如果没有绝对路径的文件
如果包含在用户配置文件中,则假定为~/.ssh,如果
包含在系统配置文件中,则为/etc/sshInclude指令可能
出现在MatchHost块内
以执行条件包含。
源:ssh_config(5)。


您应该将文件顶部的包含子句。

例如,您可能在~/.ssh/config中:

Include config.d/home

Host github.com
    HostName github.com
    User git


~/.ssh/config.d/home中:

Host laptop
    HostName laptop.lan


从注释中,使用以下内容包含config.d目录中的所有文件:

Include config.d/* 


评论


用$ ssh -V检查版本

– Pieter
16年11月13日在1:25

使用包括config.d / *将所有条目包括在config.d中。

–西蒙·伍德赛德
16-11-17在5:41

Ftr:这必须放在文件的顶部,不能仅附加到主机条目列表中。

–dtk
17年2月21日在16:47

在Ubuntu 16.04上尝试过。虽然可以,但是自动完成功能被破坏了,因此使用起来不太有用。如果要在ubuntu上升级ssh,请检查此链接gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677

– cwhsu
18年1月6日在10:12

@dtk另一个解决方法是将Include放在Host *条目内,并避免对配置重新排序

– dfogni
20年1月21日在10:11

#2 楼

不,据我所知这是不可能的。

以下是相应的开放功能请求/错误记录的链接:

https://bugzilla.mindrot.org/show_bug .cgi?id = 1585

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495

评论


还有Debian上的这个bug:bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189

–Lluís
2014年7月3日,11:50

我的天啊。它正在半途而废。从2016-04-15 13:01:08 EST开始:应用了稍微修改的补丁,它将在openssh-7.3中

– oschrenk
16 Jun 18'在0:15



这个答案当时是正确的,但现在已经过时了。

–马克·斯托斯伯格
18/12/6在21:40

#3 楼

如果要启动ssh客户端,则可以在bash中执行以下操作: br />
对于服务器守护程序sshd,您可以执行相同的操作,只需使用-f而不是-F,然后在直接启动守护程序的地方写下来。您不需要别名。

根据手册页的第二种可能性是将系统范​​围的配置放在/etc/ssh/ssh_config中,将用户范围放在~/.ssh/config中。

显然地更新一些bash版本以及如何创建设备存在一些问题。 (请参阅http://bugs.alpinelinux.org/issues/1465)

这是一种解决方法(尽管我认为这很丑陋):

#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'


因此,您可以根据需要创建一个函数(或脚本):

mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & 
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo


评论


不幸的是,这不适用于OSX的ssh:无法打开用户配置文件/ dev / fd / 63:错误的文件描述符

–阿什·柏林·泰勒
2012年8月23日在13:10

它在(Ubuntu 11.10)Linux上也对我不起作用,给出与上述@AshBerlin相同的错误。

– SzymonJeż
2012年11月27日15:13

@AshBerlin您也可以尝试,它也应适用于OSX,直到错误被修复

–estani
2012年11月27日19:32

给定ssh检查三个位置,即1.命令行,2。〜/ .ssh / config,3。/ etc / ssh / ssh_config,您也不需要在命令行上通过〜/ .ssh / config。之后只需要别名ssh ='ssh -F〜/ .ssh / foo.config'和〜/ .ssh / config。只要您不介意先加载foo.config,它就应该比上述解决方法更干净。

– Jim
2013年2月5日在3:27



@jim不,它不能那样工作。使用找到的第一个。你有试过吗手册页中的“ -F configfile:指定每个用户的备用配置文件。如果在命令行上提供了配置文件,则将忽略系统范围的配置文件(/ etc / ssh / ssh_config)。”

–estani
13年2月6日在10:52

#4 楼

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


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


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

#5 楼

与另一个“丑陋”相似,这里是我的一线:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"


评论


请注意,sftp命令将不会触发配置重新计算。

–VasyaNovikov
2015年3月13日在22:44



(我仍然喜欢答案,因为它使用“ config.d /”并且非常简单。)

–VasyaNovikov
15年3月13日在22:49

简单,优雅,但

– code_monk
16年5月29日在14:31

当心:将覆盖任何现有的〜/ .ssh / config文件

–曼森
20-2-23在6:47

#6 楼

好吧,我有点作弊。在我的bash .profile-ish文件中,有一个块可以替换登录时我的主目录的各个部分,因此我每次都只生成一个新的块。示例:

rm ~/.ssh/config
cat ~/conf/myservers.sshconfig >> ~/.ssh/config

[ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config
(or something like this:)
for i in `ls ~/conf/sshconfigs` ; do
    cat $i >> ~/.ssh/config
done

chmod 600 ~/.ssh/config


这也使我可以做一些事情,例如仅当我在主机A或B上但不在我的家里时,才将配置块添加到ssh配置文件系统。

现在我知道,有人会担心,如果您多次登录,可能会导致速度过慢,但是实际上我从未真正注意到它。而且我相信您也可以将其放入脚本中,并通过cron触发它。

#7 楼

我个人使用这些命令来编译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


希望有什么帮助。 br />

评论


您可以更进一步,将其与fswatch结合使用,以自动编译文件更改

–行军
15年2月28日在6:34

#8 楼

另一个基于FUSE的解决方案(未经我自己测试): [...]而是从许多较小的逻辑块中动态构建配置“文件”。“ linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/

评论


我认为评论内容具有足够的描述性-它说“ FUSE”(也许扩展首字母缩写会更好);链接只是一个实现。

– aviv
2013年6月23日20:20在

没有意识到简短答案的问题,答案扩展了。看起来我将不得不不时在该网站上查看我的答案,而没有电子邮件通知:)到目前为止,已学会使用收藏夹。感谢您的评论。

– amontero
13年7月7日在14:17

#9 楼

除了git以外,这些别名解决方案都不能用于ssh或其他程序。 />将此添加到您的~/.bashrc

mkdir -p ~/.ssh/config.d/
[ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins)
cat ~/.ssh/config.d/* > ~/.ssh/config


每次启动会话时,它将合并~/.ssh/config.d中的所有文件。 (第3行)

该版本的缺点是,如果您在下一个会话中更改~/.ssh/config,则您打开的更改将丢失,因此,为了防止将现有文件移至.bak文件。 (第2行)问题在于,过一会儿您将拥有大量.bak文件。

评论


加上一些is_anything_changed条件非常好

–vp_arth
15年7月4日在4:57

#10 楼

通过从Yakkety安装软件包,可以轻松地将Ubuntu上的SSH版本升级到v7.3(已在Ubuntu Xenial 16.04上进行了测试): br />
echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list
apt-get update
apt-get install -y ssh
rm /etc/apt/sources.list.d/yakkety.list
apt-get update


配置SSH以使用〜/ .ssh / config.d目录中的包含文件

ssh -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016


#11 楼

我愚蠢的回答:


试图在Xenial(16.04)上安装OpenSSH> 7.3
不喜欢它造成的混乱

所以我解决了为此:


将单独的OpenSSH配置文件保留在~/.ssh/config.d/

当您更改一个文件时,请执行cat ~/.ssh/config.d/* > ~/.ssh/config

在光荣的一天您升级到具有OpenSSH 7.3p1或更高版本的发行版,则可以创建一个包含

Include config.d/*
的文件

#12 楼

我也无法在计算机上升级SSH。

我仅在需要时才使用GNU make生成ssh配置文件:别名为

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)


它就像一个饰物。