My understanding of the way ~/.ssh/config works is that each 'Host ' line takes effect for any host matching after that point in the config file.

I have a number of personal servers and work servers that I need to connect to. I'm trying to do something like the following:

# General Settings
ControlMaster auto
ControlPath   ~/.ssh/controlmaster/%r@%h:%p
ForwardAgent  yes
ForwardX11    yes
GSSAPIAuthentication no
PubkeyAuthentication yes

# Personal Servers
Host *
User harleypig
IdentityFile ~/.ssh/personal_id_rsa

Host host1
Hostname host1.com

Host host2
Hostname host2.com

# Work Servers
Host *
User alan.young
IdentityFile ~/.ssh/work_id_rsa

Host work1
Hostname work1.companyserver.com

Host work2
Hostname work2.companyserver.com

Host *
User devuser

Host dev1
Hostname dev1.companyserver.com

Host dev2
Hostname dev2.companyserver.com

The docs seem to indicate that host1 and host2 should use 'personal_id_rsa' and the user harleypig. work1, work2, dev1 and dev2 should use 'work_id_rsa' and the first two should be the user 'alan.young' and dev1 and dev2 should be the user 'devuser'

However, this is not happening. Whatever 'Host *' I put first is what all of the following hosts try to connect with. Am I misunderstanding or missing something?

  • Thank you, between both of these answers I was able to get my connections working. – harleypig Jul 13 '11 at 22:06
up vote 31 down vote accepted

From the ssh_config manual:

Since the first obtained value for each parameter is used, more host-specific declarations should be given near the beginning of the file, and general defaults at the end.

So in your example, all hosts will use User harleypig and IdentityFile ~/.ssh/personal_id_rsa.

Think of Host directives with wildcards as fallbacks: use the following settings only if they haven't been set yet. You need to write something like this:

Host host1
Hostname host1.com
Host host2
Hostname host2.com
Host host*
User harleypig
IdentityFile ~/.ssh/personal_id_rsa

You can put multiple patterns on a Host line if a given set of host aliases can't be matched with wildcards, e.g. Host host* more* outlier.

You are definitely doing it wrong.

  • You should always put Host * as the last entry.
  • You can not have multiple Host * entries

If your work machines have a name format which you can generalize to target just the work machines, for e.g: machine1.work.com, host.work.com, fileserver.work.com then you can target your work machines as:

Host *.work.com
User alan.young
IdentityFile ~/.ssh/work_id_rsa

Same applies for your personal machines.

  • For me, putting Host * at the beginning of the file seems to work fine. Perhaps the fact that you're using a wildcard trumps the fact that it is the first entry when prioritizing them? – Zaz Feb 11 '16 at 22:31
  • Btw, the Host *.work.com is an invalid syntax. It only works the other way around: Host myserver* – Mincă Daniel Andrei Feb 20 '17 at 20:09
  • 1
    @MincăDanielAndrei it works both ways, its just a wildcard expression and you can use it as any other wildcard. Host git-codecommit.*.amazonaws.com This is a working example from my ~/.ssh/config – Hameedullah Khan Feb 21 '17 at 13:01
  • @HameedullahKhan seriously, I've tried that and it's not responding. If you do Host *subdomain.com it's not going to respond. – Mincă Daniel Andrei Feb 22 '17 at 20:38
  • 1
    @MincăDanielAndrei That behavior is documented in the man pages, if it doesn't work (for me neither) it is a bug. – goetzc Jun 5 '17 at 4:34

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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