
BASH autocomplete for SSH - DanielRibeiro
http://b.sricola.com/post/16174981053/bash-autocomplete-for-ssh
======
dryicerx
Two more places to extract hostnames for ssh auto completion are
.ssh/known_hosts and the .ssh/config.

Or give zsh a try, simply autoload compinit and it will do ssh/sftp auto
completions along with a boatload more out of the box.

~~~
mustpax
I usually set up my SSH autocompletes to read from known_hosts. The problem is
that on some systems, like say Debian, the hostnames are hashed for security
reasons. So you have to add the following line to your .ssh/config to get the
hostnames back into a readable form.

    
    
        HashKnownHosts no

------
alextingle
Zsh.

It absolutely mystifies me when people get all excited about trivial
enhancements to Bash, when Zsh has had those features for a decade.

~~~
vidarh
Bash has had this for ages too. Debian comes with it in the "bash-completion"
package, for example. People get all excited about trivial enhancements for
Bash for the same reasons they don't know about Zsh: The pain isn't great
enough for them to actively seek out alternatives.

~~~
jodrellblank
So why aren't they on by default? Why is the latest Ubunbtu (styled as a user
friendly Linux not a purist Linux) still making the clueless "HUH?" noise at
me during tab completion because it doesn't have completion-ignore-case on by
default? Or automatically showing a list of clashes or cycling through clashes
instead of sitting there like a lemon? Both also one line of config somewhere.

~~~
vidarh
Because not enough people care enough to push hard enough for it to change -
presumably most of the people who do care don't find having to do apt-get
install bash-completion onerous enough to matter.

------
jrussbowman
On the flip side a similar script to use a similar technique in .profile to
strip out all SSH lines in your history would be a good security measure. That
account gets compromised and you wouldn't have a road map of other hosts to
connect to. Could remove known_hosts on systems that don't hash the hostnames
too. Maybe I really am turning into a grumpy Sa if these are my first thoughts
on reading things like this.

~~~
jacknagel
HISTIGNORE=ssh

It won't strip existing lines, but will prevent them from being recorded in
the future.

~~~
jacknagel
Sorry, should be

    
    
        HISTIGNORE=ssh*
    

(the pattern has to match the entire line.)

Like many shell variables, this one is a colon-separated list.

------
IgorPartola
I have been using this trick for a while. It is annoying in two ways: first,
it includes misspelled hosts. Second, it does not work for scp and sftp.
Otherwise, it may save you time.

~~~
Nick_C
> it does not work for scp and sftp

The .ssh/config tip does work though. I'd rather have them there anyway since
I can give the host an alias.

    
    
      Host myproxy
      HostName xxxxxxx.xxx
      User xxxx
      Port xxxx
    

and ssh will autocomplete on my<Tab>

------
avallark
bash_completion does this for most systems. Its also available in mac ports

~~~
remi
Also, `brew install bash-completion` with Homebrew.

------
denysonique
Remote host path completion when scp'ing or rsync'ing would be great

~~~
denysonique
Actually 'ssh shared connections' does the trick and enables that feature

~~~
denysonique
[http://blogs.perl.org/users/smylers/2011/08/ssh-
productivity...](http://blogs.perl.org/users/smylers/2011/08/ssh-productivity-
tips.html)

------
jack83
you can also use ctrl+R

~~~
daniellockard
You'd be surprised how little some people know about bash ctrl commands.

~~~
snprbob86
Honestly, simply reading `man bash` from start to finish was one of the best
things I ever did. I started doing it with all sorts of stuff. May I suggest
you start with `man man`?

Then someone told me about `apropos` which is summarized in it's man page as
"search the whatis database for strings". Sooo useful. Not nearly as useful as
simply reading man pages from start to finish, but I've only got so much spare
time.

~~~
agumonkey
Reading `man` is the kind of thing you understand after years of hitting hard
walls. Even now I still despise it even though I know most of the answers are
in it. I think I want something less linear to search into, oh and I'm surely
a lazy P*S too.

------
allan_
complete -W "$(awk '/^#|^ _$/{next}{print tolower($2)}' /etc/hosts) $(awk '/
^#|^_ $/{next}{gsub(/,/," ",$1); print $1}' $HOME/.ssh/known_hosts)" ssh
telnet ping

