Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

We have a bastion server that we use to connect to multiple hosts, and our .ssh/config has grown to over a thousand lines (we have hundreds of hosts that we connect to). This is beginning to get a little unwieldy and I'd like to know if there is a way to break the .ssh/config file up into multiple files. Ideally, we'd specify somewhere that other files would be treated as an .ssh/config file, possibly like:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

I have read the documentation on ssh/config, and I don't see that this is possible. But maybe someone else has had a similar issue and has found a solution.

share|improve this question
    
Have each user login to the bastion host with their own username. Also, what are you putting into the config file that requires an entry for each host? Can't you set some defaults that are common? –  Jed Daniels Nov 27 '12 at 16:11
    
Same question on superuser.com: superuser.com/questions/247564/… –  guettli Oct 29 at 17:56

4 Answers 4

up vote 9 down vote accepted

The ~/.ssh/config file don't have a directive for including other files, possibly related to SSH's check for file permissions.

Suggestions around this can include a script to cat several changes together either on the system or via checkin hooks on a repository. One might also look into tools such as Puppet or Augeas.

However you approach it, though, you'll have to concatenate individual files to be a single file from outside of the file.

$ cat ~/.ssh/config_* > ~/.ssh/config
share|improve this answer
    
Thanks Jeff, this is a good idea. I don't know too much about Puppet or Augeas, so for the sake of keeping things as simple as possible, your solution seems best. I could break up the config into multiple configs, and create a simple script to recreate the .ssh/config file whenever one of the files is modified. I don't know how clean of a solution this is, but it does seem to do the trick and works for my purposes. –  DrewVS Mar 31 '12 at 18:19

You can specify current config file to use in ssh option like this:

ssh -F /path/to/configfile

Seems it's the only way.

Also there is noway to include one config into another.

share|improve this answer

I personally use those commands to compile the ssh config:

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.)

or:

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)

because:

alias ssh='ssh -F <(cat .ssh/*.config)'

does not work for me, returning:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor

Hope this will be of any help.

share|improve this answer

I also would use cat config_* > config to generate the whole config. But I wouldn't use puppet/cfengine etc for this, if they aren't in place yet (BTW: why not use a config management system???).

I would generate a package (deb, rpm) and put it in a local repository. And in the postinst script the cat generates your config. Perhaps you also include a local folder... The advantage is, that ssh/config updates activates on a daily base while cron-apt &Co run.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.