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

38

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

Dans Mavericks, tout fonctionnait correctement et tabje pouvais compléter automatiquement le nom d'hôte avec le fichier suivant:

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 tsur le shell, tabcela ne complète pas automatiquement le nom d'hôte.

Est-ce que quelqu'un sait si quelque chose a changé à Yosemite et maintenant je dois faire quelque chose pour que cela fonctionne?

RikyTres
la source

Réponses:

37

Vous pouvez activer la complétion du shell bash en installant bash-completionvia brew :

brew install bash-completion

Ajoutez ensuite ce qui suit à votre ~/.bash_profile:

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

La source

(Edit: brew tap homebrew/completionsest obsolète à partir de 2018.)

Danny Armstrong
la source
+1 :) Lors de l'installation de bash-completion-1.3.3.high_sierra, il me dit que je devrais ajouter [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Pourriez-vous préciser quelle version (celle ou celle qui convient) devrait être préférée et pourquoi?
Jan Nash
15

Je suppose que la coque 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 avez besoin sourcedu fichier pour que la nouvelle commande soit chargée dans votre terminal. ou Vous pouvez mettre ce code dans .bash_profile

Nelson
la source
Oui, la coquille est bash. Pourquoi chez Maveriks je n'avais pas besoin de faire ça?
RikyTres
Non, j'ai testé tout à l'heure. Je ne peux pas faire ça dans Mavericks par défaut.
nelson
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")
pause jusqu'à nouvel ordre.
2

De cet article sur MacWorld .

Copiez / collez 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 ensuite redémarrer votre terminal ou taper source ~/.bash_profile(notez que ce dernier ne fonctionnera que dans votre onglet actuel).

boeuf_booléen
la source
N'a pas travaillé pour moi. Mais apple.stackexchange.com/a/168168/136365 l'a fait. Je pense qu'il vaut mieux éviter de compter sur le rubis pour quelque chose comme ça.
Ben Creasy
0

Pour votre information, je ne sais pas comment répondre directement à la réponse de nelson car je n’ai pas encore acquis assez de réputation pour pouvoir la commenter, mais sur ma machine exécutant El Capitan, elle ^Métait ajoutée à tous les noms d’hôtes de mon fichier de configuration. . Je devais soit ajouter \rà ma $IFSvariable ou supprimer / substituer toutes les instances de \rla sortie de la seconde cat. Finalement, j'ai fait le dernier en ajoutant tr '\r' '\n'pour que cette chaîne de commande ressemble à ceci:

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'
Ian Bui
la source
-1

Vous pouvez ajouter des entrées dans / etc / hosts et les utiliser dans la saisie semi-automatique du nom d'hôte:

"ssh @" + [TAB]

Le redémarrage est requis pour que le système recharge ce fichier.

Lukdz
la source