How To Autocomplete SSH Hosts
Ahmed Musallam
Posted on September 6, 2019
So you know about SSH config file, there are several awesome articles on the subject:
and this one that covers some tips and tricks
Now, with all of that, you still have to remember the full host entry to connect and it will not be autocompleted for you.
let's say I have the following in my config file:
Host unicorn-one
HostName 1.2.3.4
User amusallam
IdentityFile ~/.ssh/id_rsa
Host unicorn-two
HostName 2.2.3.4
User amusallam
IdentityFile ~/.ssh/id_rsa
Host unicorn-three
HostName 3.2.3.4
User amusallam
IdentityFile ~/.ssh/id_rsa
and now I type ssh unicorn
into terminal and hit ⇥ Tab, it will not auto complete...
But fear not! for I have what your heart desires!
Autocomplete Script
I've only tried this on MacOs.
courtesy of this stackexchange answer:
Found it!!
It seems that in Ubuntu the entries in ~/.ssh/known_hosts
are hashed, so SSH completion cannot read them. This is a feature, not a bug. Even by adding HashKnownHosts no
to ~/.ssh/config
and /etc/ssh/ssh_config
I was unable to prevent the host hashing.
However, the hosts that I am…
add the following file: /etc/bash_completion.d/ssh
whose contents:
_ssh()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts=$(grep '^Host' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)
COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
return 0
}
complete -F _ssh ssh
Then load that file: in your ~/.bash_profile
, add:
## load ssh autocompletion
. /etc/bash_completion.d/ssh
and reload by running source ~/.bash_profile
or just terminate your terminal and reopen it.
and voila!
(The flashes you see below are me hitting ⇥ Tab)
easy peasy!
Extra helpful alias
if you want to see a list of all your hosts, you can add this alias to your .bash_profile
:
# list all "Host" and "HostName" lines, then remove the strings: "Host " and "HostName "
alias sshhosts="grep -w -i -E 'Host|HostName' ~/.ssh/config | sed 's/Host //' | sed 's/HostName //'"
reload by running source ~/.bash_profile
or just terminate your terminal and reopen it.
then you can run it:
sshhosts
from unicorn example above, this prints:
unicorn-one
1.2.3.4
unicorn-two
2.2.3.4
unicorn-three
3.2.3.4
Posted on September 6, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.