I'd like to set up command completion on zsh to display host names after I type
ssh [TAB]
taking the names out of my .ssh/config file (and preferably from known_hosts and /etc/hosts and anywhere else that makes sense) and presenting one single list.
It does some of this currently, but
- it doesn't use .ssh/config at all
- it requires a username first, even though using .ssh/config makes typing usernames unnecessary
- it presents multiple lists (probably one from known_hosts and another from /etc/hosts, but I haven't verified that)
So I want to be include known usernames as well as known hostnames in the (preferably single) list after typing ssh [TAB]
(I'm coming here before Google because 1) it'll result in the answer getting stored here, and 2) it's probably more efficient. If no one else answers, I'll hunt down the answer.)
Here's the relevant part from my
.zshrc
. It hasn't changed since 2002, so I might write it differently today, but it still works to complete host names from~/.ssh/config
and~/.ssh/known_hosts
(ifHashKnownHosts
is off — it didn't exist in those days).The function that provides
ssh
completion is located at/usr/share/zsh/functions/Completion/Unix/_ssh
on my system.Also see
man zshcompsys
for documentation (especially do a search on "host" which appears in multiple places and "ssh" which appears in a couple of places).It may be possible that adding a
zstyle
command to your~/.zshrc
would do what you're looking for without having to modify the completion function.I do this using a list of all hosts on a given domain using dig. You can replace the function below with whatever lookup system you want including your hosts file or a static list:
Note: The code above might not fully replace the complete system for the ssh command in your configuration. If you have problems with it, try changing the "ssh" command to some other random command like "mycompletetest" and see if the completion works for that.
Also note that this does the dns zone transfer on every completion! If you use this a lot or on a fairly static domain it would make sense to do the lookup and save the result, then in your lookup function just set reply=zone_result.
I like keeping my hashed
known_hosts
file and would rather not turnHashKnownHosts
off. I'd found that seeding what @Gilles has with what is already in my history has been quite effective for my needs.Also, FWIW, this is what I used for Bash: