有没有办法让一个 SSH 配置文件包含另一个配置文件?

有没有办法让一个 SSH 配置文件包含另一个配置文件?

如果有关系的话:

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

我希望一个 SSH 配置文件包含另一个。用例是在我的默认.ssh/config文件中定义我想要的任何内容,然后在单独的文件(例如)中预先添加一些额外内容~/.ssh/foo.config。但是,我希望第二个文件包含第一个文件,这样我就不必在第一个文件中复制所有内容。这可行吗?谢谢!

答案1

从 7.3p1 及更高版本开始,有一个Include关键字,它允许您包含配置文件。

Include

    包含指定的配置文件。可以指定多个路径名,每个路径名可以包含 glob(3) 通配符,对于用户配置,可以包含类似 shell 的“~”引用用户主目录。~/.ssh如果文件包含在用户配置文件中或/etc/ssh包含在系统配置文件中,则假定没有绝对路径的文件在。  Include指令可能出现在Match或者Host块来执行条件包含。
来源:ssh_配置(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/* 

答案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"

相关内容