操作系统:Ubuntu 10.04
SSH:OpenSSH_5.3p1 Debian-3ubuntu5
我想要一个SSH配置文件包括另一个。用例是在默认的
.ssh/config
文件中定义所需的内容,然后在一个单独的文件中预先添加一些其他内容(例如~/.ssh/foo.config
)。不过,我希望第二个文件包含第一个文件,因此我不必重复第一个文件中的所有内容。那可行吗?谢谢!#1 楼
从7.3p1开始,有Include
关键字,它允许您包含配置文件。
Include
包含指定的配置文件(s)。
可以指定多个路径名,每个路径名
可以包含glob(3)通配符,对于用户配置,
对用户主目录的类似于shell的“〜”引用。如果没有绝对路径的文件
如果包含在用户配置文件中,则假定为
~/.ssh
,如果包含在系统配置文件中,则为
/etc/ssh
。 Include
指令可能出现在
Match
或Host
块内以执行条件包含。
源: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
指令可能会出现在Match
或Host
块内,以执行条件包含。(以下是已解决的错误报告的链接,其中还包括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)
它就像一个饰物。
评论
关于serverfault的相同问题:serverfault.com/questions/375525/…