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?

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.)


+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


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).


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'

-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.

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.