Activer l'auto-completion pour la commande SSH
Aujourd'hui nous allons voir une petite astuce généralement réservée aux administrateurs système. Elle permet d'activer l'auto-complétion lorsque l'on souhaite se connecter à un serveur distant via la commande SSH. C'est très pratique si vous administrez plusieurs dizaines de serveurs différents et que vous en avez marre de saisir le nom des machines à chaque fois.
Pour mettre en place l'auto-complétion sur les commandes ssh, scp et sftp, ouvrez un terminal, éditez votre fichier ~/.bashrc pour lui ajouter les deux lignes suivantes :
# Auto Completion SSH
complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh scp sftp
Sauvegardez et quittez. Pour prendre en compte la modification, lancez cette commande :
source ~/.bashrc
Il ne vous reste plus qu'à tester avec un ssh + le début du nom d'une machine + Tab.
Attention tout de même, cette astuce ne fonctionne que si vous vous êtes déjà connecté au serveur avant. En effet, si on étudie la ligne ajoutée dans le bashrc de plus près, on remarque que la liste des serveurs est générée en fonction de ce que l'on trouve dans ~/.ssh/known_hosts. Or, ce dernier est complété après avoir accepté la clé ssh identification lors de la première connexion (lorsque vous saisissez 'yes' avant le mot de passe).
11 Commentaires pour "Activer l'auto-completion pour la commande SSH"
Flux des commentaires de cet article Ajouter un commentaireMerci pour l'astuce !
Question : d'où vient ce tee-shirt ? Je veux le même. ^^
Plus partisan de parser le fichier ~/.ssh/config avec des trucs de ce genre:
Host xbmc mediacenter
hostname 192.168.0.16
#hostname xbmc.toto.42
user toto
port 2233
# Ne pas vérifier la clé de l'hôte
# Utile pour les machines de tests, réinstallées souvent ...
#UserKnownHostsFile /dev/null
#StrictHostKeyChecking no
Ainsi je peux appeler `ssh x[TAB]` ou `ssh med[TAB]` par exemple.
En plus d'être plus clair (je trouve), on profite de l'ensemble des bonnes fonctionnalités de la config ssh. Autre point que j'aime bien pour les personnes qui ouvre simultanément plusieurs connections ssh sur une même machine:
# Ensemble des hôtes:
Host *
# Établir une connection "maître"
ControlMaster auto
# Passer toutes les autres connections sur cet hôte par la connection maître
# Ainsi une 2nde connection sur un hote déjà connecté ne demandera pas de mot de passe.
ControlPath /tmp/ssh-%r@%h:%p
Last point pour ceux qui ont une connection établie ou qui utilise les clefs publique/privée, l'auto-complétion ne s'arrête pas au nom de la machine, typiquement chez moi:
scp med[TAB]:/etc/me[TAB]/v[TAB]/mo[TAB]/fil[TAB] .
me donnera "mediacenter:/etc/media/video/movies/film_de_vacances.avi"
@Gardouille : Exactement, je m'empressait de parler de ce fichier de conf bien trop souvent ignoré.
@tominardi : Yes, et on a pas encore évoqué la simplification de réaliser des tunnel/forward/... ^^
@ptit-seb
Bonne idée, mais quelques points me troubles :
* Pourquoi ne pas utiliser un des fichiers [/etc/|~/.]bash_completition ?
* Pourquoi ne pas utiliser l'outil ssh-keyscan au lieu d'un parsing 'manuel' du fichier know_hosts ?
* Si HashKnownHosts est à Yes ça ne fonctionnera pas et on l'active sur les serveurs,
il faudrait bruteforcer : http://blog.rootshell.be/2010/11/03/bruteforcing-ssh-known_hosts-files/
Le [tab] qui tue en gros !
@gardouille
Je plussoie l'utilisation dufichier ~/.ssh/config (le [tab] magique et le [tunnel|forward]ing),
mais faut penser à protéger ce fichier (encfs,dm-crypt ...etc).
Si je peux apporter ma petite touche :
#Prevent "Too many authentication faillure" when ssh agent try each key in .ssh directory
IdentitiesOnly yes
# Pleonasm
#Host *
# KeepAlive
ServerAliveInterval 60
# Multiplex
ControlMaster auto
# ! /tmp
ControlPath ~/.ssh/socks/%h_%p_%r
#Domain
Host *.domain.tld
Port 22
User root
Protocol 2
IdentityFile ~/.ssh/domain
Host bouncer
Hostname hostname.domain.tld
User admin01
IdentityFile ~/.ssh/hostname.domain.admin01
# Sub
Host *.sub.domain.tld
Port 8422
User staff
IdentityFile ~/.ssh/sub.domain.staff
#Proxy
ProxyCommand ssh bouncer exec nc -q0 %h %p
# Anon
Hostname pubserv.domain.tld
User anon
IdentityFile ~/.ssh/anon
ProxyCommand connect -4 -S localhost:9050 $(tor-resolve %h localhost:9050) %p
...
J'avoue /tmp ... corrigé!
Étrangement, il n'y a pas d'indentation dans les commentaires sur le blog, mais tout ok dans le mail reçu si on s'abonne aux commentaires.
c'est pour les windosien sa non? sinon énorme l'image
Wouahhhh excellent le t-shirt je le veux !!!!!
Merci pour l'astuce.. Voilà un moment que je cherchais (sans trop rtfm je l'avoue) comment faire.
# Auto Completion SSH
ssh scp sftp
complete -W "$( echo $(for i in $(find ~/.ssh -type f -print); do cat $i | egrep -v '^$|^cat' | grep 'host ' | awk '{print $2}'; done))" ssh scp sftp
#autocompletion avev ssh/conf (et les conf.d/*)
@ypso : (ajout d'un -i si comme mois vous avez des maj par endroit)
# Auto Completion SSH
ssh scp sftp
complete -W "$( echo $(for i in $(find ~/.ssh -type f -print); do cat $i | egrep -v '^$|^cat' | grep -i 'host ' | awk '{print $2}'; done))" ssh scp sftp
#autocompletion avev ssh/conf (et les conf.d/*)