[PATCH] Allow matching HostName against Host entries

Ryan Kavanagh rak at debian.org
Tue Apr 9 11:09:41 EST 2013


Hi Ben,

On Monday, April  8, 2013 at 13:13:38 -0500, Ben Lindstrom wrote:
> Isn't this failure to understand that the Host list is in first
> match order?  So place what you wish to have highest priority first,
> and then the remaining wildcard matches towards the bottom.

Far from it, this patch helps users make use of the fact that the Host
list is in first match order. Very briefly put, what it lets you do is
have ssh also try to match the first HostName entry from a matching
Host stanza against any subsequent Host stanzas. Without this patch,
if you had a stanza like

	Host myhost
	     HostName myhost.foo.bar

the command "ssh myhost" would not have ssh match against the stanza

	Host *.foo.bar
	     Foo1 Bar1

You could argue that I could just setup the "search" option in
resolv.conf. But what if I have hosts outside of my local domain, or
my administrator doesn't give me edit writes to /etc/resolv.conf? You
could also argue that I could change this wildcard to

	Host *.foo.bar myhost
	     Foo1 Bar1

but this quickly becomes unmanageable with complex config files, as my
example below shows.

> I've been doing this for ages without needing yet another option.
> Unless your description isn't fully explaining why we need this
> option.

Maybe my example wasn't clear. Imagine you have 510 boxes split across
two networks; 255 are in a student lab, and the remaining 255 are in a
professor lab. Let's make things dramatic and imagine you have
settings for each one of these machines, and settings for each lab,
and settings for both labs. You want to have an alias for each host,
for example, you want to be able to go "ssh slab1" to connect to
"lab1.student.lab" (for the sake of simplicity, I've just numbered
things and one could just use a "slab*" wildcard, but let's keep in
mind cases where this wouldn't work). Under the current ssh_config,
you'd have something that looked like:

	#### BEGIN CURRENT SSH_CONFIG ####
	VisualHostKey yes

	Host slab1
	     User slab1
	     HostName lab1.student.lab

	## Repeat for slab{2..254}

	Host slab255
	     User slab255
	     Hostname lab255.student.lab

	Host plab1
	     User plab1
	     HostName lab1.professor.lab

	## plab{2..254}

	Host plab255
	     User plab255
	     HostName lab255.professor.lab

	# Insert whatever other hosts you know of

	Host *.student.lab slab1 slab2 ... slab255
	     IdentityFile ~/.ssh/id_ecdsa.slab
	     UserKnownHostsFile ~/.ssh/known_hosts.d/student.lab

	Host *.professor.lab plab1 plab2 ... plab255
	     IdentityFile ~/.ssh/id_ecdsa.plab
	     UserKnownHostsFile ~/.ssh/known_hosts.d/professor.lab

	Host *.lab slab1 slab2 ... slab255 plab1 plab2 ... plab255
	     VisualHostKey no
	     ForwardX11 yes
	#### END CURRENT SSH_CONFIG ####

Note that the Host lines matching each lab will be 256 entries long,
and the one matching both labs will be 511 entries long. Now imagine
being able to match the corresponding HostName entry against a
wildcard. With my patch, your config would look like:

	#### BEGIN PROPOSED SSH_CONFIG ####
	MatchHostName yes
	# ^^^^ This is the magic line
	VisualHostKey yes

	Host slab1
	     User slab1
	     HostName lab1.student.lab

	## Repeat for slab{2..254}

	Host slab255
	     User slab255
	     Hostname lab255.student.lab

	Host plab1
	     User plab1
	     HostName lab1.professor.lab

	## plab{2..254}

	Host plab255
	     User plab255
	     HostName lab255.professor.lab

	# Insert whatever other hosts you know of

	Host *.student.lab
	     IdentityFile ~/.ssh/id_ecdsa.slab
	     UserKnownHostsFile ~/.ssh/known_hosts.d/student.lab

	Host *.professor.lab
	     IdentityFile ~/.ssh/id_ecdsa.plab
	     UserKnownHostsFile ~/.ssh/known_hosts.d/professor.lab

	Host *.lab
	     VisualHostKey no
	     ForwardX11 yes
	#### END PROPOSED SSH_CONFIG ####

In my opinion, this proposed ssh_config is considerably cleaner, and
easier to understand and manage. My own interest in this patch is
similar. I have a couple dozen hosts I connect to across three
domains. I'd like to be able to connect to each of these by using the
subdomain (set with HostName in a Host stanza matching the subdomain),
while still having the domain wildcard matched.

As for implementation, the "MatchHostName yes" doesn't need to be
enabled globally as in the example above. It can be used only for
certain aliases. Moreover, my patch only takes effect once there's
been a HostName entry in a matching Host stanza and MatchHostName has
been enabled.

I hope this helps, please let me know if you have any questions,
concerns, or comments.

Best wishes,
Ryan

-- 
|_)|_/	Ryan Kavanagh		| Debian Developer
| \| \	http://ryanak.ca/	| GPG Key 4A11C97A


More information about the openssh-unix-dev mailing list