51 votes

La complétion par tabulation pour les hôtes définis dans ~/.ssh/config ne fonctionne plus sur Yosemite

J'essaie de créer mon ~/.ssh/config pour simplifier ma vie professionnelle sur la connexion au serveur.

Dans Mavericks, tout a fonctionné correctement et avec l'option tab J'ai été capable d'autocompléter le nom d'hôte avec un fichier comme celui-ci :

Host test-host-name
    HostName 192.168.1.2
    User root

La même configuration sur Yosemite a un comportement différent. Lorsque je tape ssh t sur le shell le tab n'autocomplète pas le nom d'hôte.

Quelqu'un sait-il si quelque chose a changé dans Yosemite et que je dois maintenant faire quelque chose pour que cela fonctionne ?

54voto

Danny Armstrong Points 611

Vous pouvez activer la complétion du shell bash en installant bash-completion via brasser :

brew install bash-completion

Ajoutez ensuite les éléments suivants à votre ~/.bash_profile :

if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi

Source :

(Edit : brew tap homebrew/completions est déprécié à partir de 2018).

1 votes

+1 :) Lors de l'installation de bash-completion-1.3.3.high_sierra, il me dit que je dois ajouter [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion . Pourriez-vous préciser quelle version (la vôtre ou celle-là) doit être préférée et pourquoi ?

1 votes

@JanNash C'est essentiellement une version en une seule ligne de cela. if ci-dessus. En outre, le $(brew --prefix) le fera fonctionner si votre hombrew ne s'installe pas à /usr/local . Vous devez utiliser la version affichée comme réponse.

2 votes

Cela ne fonctionne pas sur mon Mac M1.

20voto

nelson Points 2256

Je suppose que le shell de votre Mac est bash.

Vous devez compléter la commande ssh, pour plus de détails vous pouvez lire man complete

_complete_ssh_hosts ()
{
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        comp_ssh_hosts=`cat ~/.ssh/known_hosts | \
                        cut -f 1 -d ' ' | \
                        sed -e s/,.*//g | \
                        grep -v ^# | \
                        uniq | \
                        grep -v "\[" ;
                cat ~/.ssh/config | \
                        grep "^Host " | \
                        awk '{print $2}'
                `
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

N'oubliez pas que vous devez source le fichier pour obtenir la nouvelle commande à charger dans votre terminal. ou Vous pouvez mettre ce code dans .bash_profile

1 votes

Oui, le shell est bash. Pourquoi dans Maveriks je n'avais pas besoin de faire ces choses ?

0 votes

Non, je viens de tester. Je ne peux pas le faire dans Mavericks par défaut.

0 votes

comp_ssh_hosts=$(awk -F , 'FNR== NR && ! /^#|\[/ {field = $1} FNR != NR && /^Host / {field = $2} {hosts[field]} END {for (host in hosts) {print host}' "$HOME/.ssh/known hosts" "$HOME/.ssh/config")

4voto

beef_boolean Points 39

De cet article sur MacWorld .

Copier/coller le texte suivant dans ~/.bash_profile :

complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh

Vous devrez alors soit redémarrer votre terminal, soit taper source ~/.bash_profile (notez que cette dernière ne fonctionnera que dans votre onglet actuel).

0 votes

Cela n'a pas fonctionné pour moi. Mais apple.stackexchange.com/a/168168/136365 a fait. Je pense qu'il est préférable d'éviter de s'appuyer sur Ruby pour quelque chose comme ça.

1voto

Ian Bui Points 11

Pour information, je ne sais pas comment répondre directement à la réponse de Nelson puisque je n'ai pas encore acquis une réputation suffisante pour la commenter, mais sur ma machine exécutant El Capitan, ^M a été ajouté à tous les noms d'hôtes de mon fichier de configuration. Je devais soit ajouter \r à mon $IFS ou supprimer/substituer toutes les instances de la variable \r à partir de la sortie du second cat . En fin de compte, j'ai fait ce dernier en ajoutant tr '\r' '\n' pour que la chaîne de commande ressemble à ça :

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'

1voto

0xCAFED00D Points 11

Réponse de Nelson (ci-dessus) ne vous dit pas quelle version de MacOS il utilise.

Pour MacOS 10.14, après avoir installé bash-completion avec :

brew install bash-completion

Le programme d'installation m'a dit d'ajouter cette ligne à mon .bash_profile (que j'ai mis dans mon .profile à la place) et cela a fonctionné :

  [[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X