Answers:
从7.3p1开始,有Include
关键字,它允许您包含配置文件。
Include
包括指定的配置文件。可以指定多个路径名,每个路径名都可以包含glob(3)通配符,并且对于用户配置,还可以使用类似于外壳的“〜”引用用户主目录。
资料来源:ssh_config(5)。~/.ssh
如果包含在用户配置文件中或/etc/ssh
包含在系统配置文件中,则认为没有绝对路径的文件将位于其中。Include
指令可能出现在Match
或Host
块内以执行条件包含。
例如,您可能在~/.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/*
Include config.d/*
以包括所有条目config.d
。
Host
条目列表中。
不,据我所知这是不可能的。
以下是相应的开放功能请求/错误凭单的链接:
https://bugzilla.mindrot.org/show_bug.cgi?id=1585
https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495
Slightly modified patch applied, this will be in openssh-7.3
如果要启动ssh客户端,可以在bash中执行以下操作:
#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'
那么您通常使用ssh,它将以该顺序读取两个文件。
对于服务器守护程序,sshd
您可以执行相同的操作,只需使用-f
代替,-F
然后在直接启动守护程序的地方写下来。您不需要别名。
根据手册页的第二种可能性是将系统范围的配置放入/etc/ssh/ssh_config
,而用户则放入~/.ssh/config
。
更新显然,某些bash版本以及如何创建设备存在一些问题。(请参阅http://bugs.alpinelinux.org/issues/1465)
这是一种解决方法(尽管我认为这很丑陋):
mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo &
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo
因此,您可以根据需要创建一个函数(或脚本):
ssh() {
tmp_fifo=$(mktemp -u --suffix=_ssh_fifo)
mkfifo "$tmp_fifo"
cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null &
/usr/bin/ssh -F "$tmp_fifo" "$@"
rm "$tmp_fifo"
}
~/.ssh/config
,3. /etc/ssh/ssh_config
,您也不需要传递~/.ssh/config
命令行。正义alias ssh='ssh -F ~/.ssh/foo.config'
并且~/.ssh/config
应该在那之后被拾起。只要您不介意foo.config
首先加载,它应该比上面的解决方法更干净。
与另一个“丑陋”类似,这里是我的一线:
alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
sftp
命令不会触发配置重新计算。
好吧,我有点作弊。在我的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触发它。
我个人使用这些命令来编译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
希望这会有所帮助。
另一个基于FUSE的解决方案(未经测试):
https://github.com/markhellewell/sshconfigfs
“无需继续管理一个大文件,而是从许多较小的逻辑块中动态构建配置“文件”。
我还发现了一篇通过FIFO执行此操作的文章:http : //www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/
这些别名解决方案均不能用于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
条件
通过从Yakkety安装软件包,可以轻松地将Ubuntu上的SSH版本升级到v7.3(在Ubuntu Xenial 16.04上进行了测试):
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 -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016
配置SSH以使用〜/ .ssh / config.d目录中的include
mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config
我也无法在计算机上升级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)
然后ssh被别名为
alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'
它像一种魅力。