Is there a way for one SSH config file to include another one?
From 7.3p1 and up, there is the Include
keyword,
which allows you to include configuration files.
Include
Include the specified configuration file(s). Multiple pathnames may be specified and each pathname may contain glob(3) wildcards and, for user configurations, shell-like “~” references to user home directories. Files without absolute paths are assumed to be in
Source: ssh_config(5).~/.ssh
if included in a user configuration file or/etc/ssh
if included from the system configuration file.Include
directive may appear inside aMatch
orHost
block to perform conditional inclusion.
You should put the Include clause on top of the file.
For example you could have in ~/.ssh/config
:
Include config.d/home
Host github.com
HostName github.com
User git
and in ~/.ssh/config.d/home
:
Host laptop
HostName laptop.lan
From the comments, use the below to include all files in the config.d
directory:
Include config.d/*
No, to my knowledge this is not possible.
Here are the links to corresponding open feature requests / bug tickets:
https://bugzilla.mindrot.org/show_bug.cgi?id=1585
https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495
If you want to start a ssh client, you could do this in bash:
#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'
then you use ssh normally and it will have both files read in that order.
For the server daemon sshd
you could do the same, just use -f
instead of -F
and write this down where you start the daemon directly. you don't need an alias.
A second possibility according to the man page is to put the system wide configuration in /etc/ssh/ssh_config
and the user one in ~/.ssh/config
.
Update Apparently there is some problem with some bash versions and how the devices are created. (see http://bugs.alpinelinux.org/issues/1465)
This is a workaround (though in my opinion ugly):
mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo &
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo
so if you want, you may create a function out of it (or a script):
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"
}