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.

pradeepchhetri
la source

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
kwarrick
la source
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!

dotancohen
la source
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).

Gilles Quenot
la source
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