Shellscript
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.

Blonde Shell Mini

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 commentaire
  •  

    Merci pour l'astuce ! :-)

    Question : d'où vient ce tee-shirt ? Je veux le même. ^^

    Fred , le 26 novembre 2013 à 13:45
  •  

    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 , le 26 novembre 2013 à 14:31
  •  

    @Gardouille : Exactement, je m'empressait de parler de ce fichier de conf bien trop souvent ignoré.

    tominardi , le 26 novembre 2013 à 14:34
  •  

    @tominardi : Yes, et on a pas encore évoqué la simplification de réaliser des tunnel/forward/... ^^

    Gardouille , le 26 novembre 2013 à 14:46
  •  

    @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

    ... ;)

    Hanne Haunime , le 26 novembre 2013 à 22:22
  •  

    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.

    Gardouille , le 27 novembre 2013 à 10:35
  •  

    c'est pour les windosien sa non? sinon énorme l'image

    sl33k , le 28 novembre 2013 à 17:43
  •  

    Wouahhhh excellent le t-shirt je le veux !!!!!

    zaken7 , le 29 novembre 2013 à 00:02
  •  

    Merci pour l'astuce.. Voilà un moment que je cherchais (sans trop rtfm je l'avoue) comment faire.

    Snorky , le 13 janvier 2014 à 11:40
  •  

    # 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 , le 30 septembre 2020 à 17:38
  •  

    @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/*)

    ypso , le 30 septembre 2020 à 17:46

actualité android apache apple astuce astuces bash bilboblog blog boot chrome clavier commande commandes conky date debian Desktop développement elementary exploit faille fedora firefox flash gimp gnome google graphique Graphisme hack hacking Hardware humour intel internet iphone jailbreak Jeux Kde kernel libre Linux log logiciels Logiciels Libres lucid lynx maemo mail maquette metasploit microsoft mobile mockup monitoring mozilla multi-touch musique mysql n900 nautilus nokia noyau openoffice open source password photos php Planet publicité redhat red hat rpm réseau screenshot script serveur serveurs shell sql ssh statistiques sysadmin system Sécurité thème tux-planet tv twitter ubuntu unity vidéo vidéos vlc voyage wallpaper windows wordpress yum