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?
Best Answer
From the
ssh_config
manual:So in your example, all hosts will use
User harleypig
andIdentityFile ~/.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: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
.