web-dev-qa-db-fra.com

Noms de serveur à saisie semi-automatique pour SSH et SCP

J'ai quelques serveurs configurés dans ~/.ssh/config, comme alpha et beta. Comment configurer Bash de telle sorte que les commandes ssh al<tab> et scp file.tgz al<tab> autocomplete les noms des serveurs configurés?

Je ne veux pas ajouter les serveurs à un autre fichier (c'est-à-dire un tableau Bash) chaque fois qu'un est ajouté, car nous ajoutons et supprimons des serveurs régulièrement et la liste est assez longue.

67
dotancohen

Je l'ai trouvé !!

Il semble que dans Ubuntu les entrées dans ~/.ssh/known_hosts sont hachés , donc l'achèvement SSH ne peut pas les lire. C'est une fonctionnalité, pas un bug. Même en ajoutant HashKnownHosts no à ~/.ssh/config et /etc/ssh/ssh_config Je n'ai pas pu empêcher le hachage de l'hôte.

Cependant, les hôtes qui m'intéressent se trouvent également dans ~/.ssh/config. 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 ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

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

Mettez ce script dans /etc/bash_completion.d/ssh puis 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 pour avoir écrit ce formidable guide!

72
dotancohen

Préemballé

Vous ne dites pas quelle distribution vous utilisez mais sur mon système Fedora 19 j'ai le paquet suivant installé, bash-completion qui fournit cette fonctionnalité via ce fichier de règles d'achèvement:

/usr/share/bash-completion/completions/ssh

Voici le package que j'ai installé:

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

Si vous regardez dans ce fichier de règles, vous verrez des strophes interrogeant le $HOME/.ssh/config fichier:

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

Rouler le vôtre

J'ai également trouvé ce Gist, known_hosts_autocomplete.sh , qui fait quelque chose de similaire sauf avec le $HOME/.ssh/known_hosts fichier.

# add to ~/.bash_profile, and close/reopen a Shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

Vous pourriez faire quelque chose de similaire en utilisant votre $HOME/.ssh/config fichier si, pour une raison quelconque, vous ne parvenez pas à trouver le fichier de règles d'achèvement pour ssh déjà préemballé.

16
slm

J'ai trouvé que la saisie semi-automatique ne fonctionnait pas car Ubuntu hachait les hôtes connus. Vous pouvez ajouter

Host *
    HashKnownHosts no

À ton .ssh/config fichier mais les hôtes existants ne seront pas hachés.

9
M1ke

Pour activer l'auto-complétion ssh dans Debian et Ubuntu:

Sudo apt-get install bash-completion

Notez que cela a rien du tout à faire avec le hachage known_hosts, contrairement à ce qui a été indiqué ci-dessus et à la question d'origine. Si vous vouliez effectuer la saisie semi-automatique à partir de known_hosts, vous devrez bien sûr désactiver le hachage, mais c'est fortement déconseillé.

Par exemple, j'ai:

Host *
    HashKnownHosts yes

dans mon .ssh/config, et j'ai toujours l'auto-complétion ssh qui fonctionne très bien contre les hôtes répertoriés dans .ssh/config et/etc/hosts. Vous devez ajouter l'hôte à .ssh/config comme l'OP l'a indiqué:

Host my-awesome-Host Hostname the.real.Host.name

(Ou, vous pouvez ajouter une entrée Host à/etc/hosts, qui est une autre source pour les scripts Debian/Ubuntu.)

Ensuite, vous pouvez simplement taper ssh my-awe<tab> et il sera terminé automatiquement. Encore une fois, c'est même si vous HashKnownHosts, ce qui est fortement recommandé. (Notez que l'achèvement de bash doit être activé dans votre shell bash, et vous devez spécifiquement installer ces scripts comme ci-dessus pour votre distribution.)

Ensuite, ajoutez ces lignes à votre .bashrc pour l'activer (nécessite une déconnexion et une reconnexion, ou juste un nouveau bash tapé pour lancer un nouveau Shell. (Vous n'avez pas besoin d'activer s'il est déjà activé dans /etc/bash.bashrc et /etc/profile sources /etc/bash.bashrc).

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Cela permettra l'auto-complétion ssh (entre autres!) À partir de ~/.ssh/config, /etc/hosts, etc.

Notez que Debian utilise par défaut ash au lieu de bash. Vous pouvez facilement basculer vers bash:

Sudo usermod -s /bin/bash "$USER"

(Vous devrez vous déconnecter et vous reconnecter pour que cela prenne effet.)

5
Jamieson Becker

Sur Ubuntu 14.04, ssh complète automatiquement les serveurs mentionnés dans votre ~/.ssh/config

Je l'ai remarqué quand je me suis rendu compte que seul un des serveurs auquel j'accède généralement à l'auto-complétion. La seule différence entre les deux était une entrée dans le fichier de configuration ssh qui était liée à l'authentification. Lorsque j'ai ajouté une nouvelle entrée au fichier de configuration pour l'autre serveur, il a également commencé à se compléter automatiquement.

Voici l'entrée pour ceux qui demandaient:

Host server-name 
    GSSAPIAuthentication=no

Je serais très surpris si cela importait ce que vous spécifiez dans la configuration (tant qu'il est toujours valide, bien sûr).

3
Noah