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.
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!
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"
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é.
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.
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.)
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).