Fonction de complétion automatique Bash pour SSHing dans différents hôtes


8

J'ai une grande liste de serveurs que j'utilise normalement sshtout le temps. Existe-t-il un moyen d'utiliser bashou zshpour que je puisse conserver la liste des noms d'hôte et l'auto-complétion bash parcourt le fichier et me suggère des cases commençant par ces lettres chaque fois que je tape les premières lettres du nom d'hôte.

Réponses:


8

Zshl'achèvement fonctionne avec les signets dits ssh. Ce sont des configurations par hôte dans ~/.ssh/config.

Par exemple,

  host baz
    hostname 192.168.1.2
    port 22
    user warrick

  host bar
    hostname example.com
    port 2200
    user kevin
    identityfile /home/warrick/.ssh/ec2.pem

man ssh_config pour voir une liste complète des options.

ÉDITER

J'utilise le script d'achèvement de ohmyzsh :

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

Dans un style similaire à ohmyzsh, j'ai placé le script ci-dessus dans ~/.zsh/libs/completion.zshet l' ai ajouté à ~/.zshrc.

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done

Je n'utilise pas zsh mais bash ...
— Gilles Quenot

À droite, la question OP est pour bash ou zsh, mon commentaire sur votre message était simplement de favoriser ~ / .ssh / config à / etc / hosts si possible, ce qui, selon sa question, est possible lors de l'utilisation de zsh.
— kwarrick


6

Copié de ma propre réponse sur unix.SE :

Si vous êtes sur un hôte Ubuntu, vous devez savoir que dans Ubuntu les entrées dans ~/.ssh/known_hostssont hachées , donc l'achèvement SSH ne peut pas les lire. C'est une fonctionnalité, pas un bug. Même en ajoutant HashKnownHosts noà ~/.ssh/configet /etc/ssh/ssh_configje n'ai pas pu empêcher le hachage de l'hôte.

Cependant, vous pouvez lire les entrées configurées depuis ~/.ssh/config, qui ne sont pas hachées. Voici un script pour Bash Completion qui lit les entrées de ce fichier:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config | awk '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

Mettez ce script /etc/bash_completion.d/sshet sourcez-le avec la commande suivante:

$ . /etc/bash_completion.d/ssh

J'ai trouvé ce guide inestimable et je n'aurais pas pu l'écrire sans lui. Merci Steve Kemp d' avoir écrit ce formidable guide!


2
+1 mais je remplacerais la ligne awk par opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')parce que la ~/.ssh/configsyntaxe permet plusieurs noms sur une seule ligne
— nhed

@nhed: Merci! Je ne savais pas que c'était autorisé.
— dotancohen

0

Pour que cela fonctionne, mettez tous les hôtes que vous souhaitez compléter dans votre /etc/hostsfichier.

Vous avez également besoin d'un bash-completionpackage (contenant le fichier / etc / bash_completion et le répertoire /etc/bash_completion.d)

et le source dans ~ / .bashrc ( . /etc/bash_completion- parfois il est commenté dans /etc/bash.bashrc ou dans ~ / .bashrc).


4
Je déconseille d'utiliser / etc / hosts. Ajoutez plutôt les soi-disant signets ssh dans ~ / .ssh / config. man ssh_configpour plus de détails, mais il est beaucoup plus polyvalent, vous permettant de spécifier plusieurs alias, nom d'utilisateur, port et bien plus encore.
— kwarrick

Avec archlinux, lorsque je mets quelque chose /etc/ssh/ssh_config, je n'ai pas terminé de travailler pour les hôtes configurés.
— Gilles Quenot

Voir ma réponse étendue, j'utilise l'achèvement de ohmyzsh.
— kwarrick

1
Si vous regardez la source , vous verrez que le script vérifie known_hostsainsi que les autres fichiers de configuration, par exemple.~/.ssh/config
— jasonwryan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.