如果有关系的话:
- 操作系统:Ubuntu 10.04
- SSH:OpenSSH_5.3p1 Debian-3ubuntu5
我希望一个 SSH 配置文件包含另一个。用例是在我的默认.ssh/config
文件中定义我想要的任何内容,然后在单独的文件(例如)中预先添加一些额外内容~/.ssh/foo.config
。但是,我希望第二个文件包含第一个文件,这样我就不必在第一个文件中复制所有内容。这可行吗?谢谢!
答案1
从 7.3p1 及更高版本开始,有一个Include
关键字,它允许您包含配置文件。
Include
包含指定的配置文件。可以指定多个路径名,每个路径名可以包含 glob(3) 通配符,对于用户配置,可以包含类似 shell 的“~”引用用户主目录。
来源:ssh_配置(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/*
答案2
如果您想启动 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"
}
答案3
据我所知,在 2012 年,这是不可能的。
以下是相应的开放功能请求/错误单的链接:
https://bugzilla.mindrot.org/show_bug.cgi?id=1585
https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495
答案4
与其他“丑陋”类似,这是我的一句话:
alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"