Tengo algunos servidores configurados en ~/.ssh/config
, como alpha
y beta
. ¿Cómo podría configurar Bash de modo que los comandos ssh al<tab>
y scp file.tgz al<tab>
autocompletar los nombres de los servidores configurados?
No quiero agregar los servidores a otro archivo (es decir, una matriz Bash) cada vez que se agrega uno, ya que agregamos y eliminamos servidores regularmente y la lista es bastante grande.
¡Lo encontré!
Parece que en Ubuntu las entradas en ~/.ssh/known_hosts
son hash , por lo que la finalización de SSH no puede leerlos Esto es una característica, no un error. Incluso agregando HashKnownHosts no
a ~/.ssh/config
y /etc/ssh/ssh_config
No pude evitar el hash del Host.
Sin embargo, los hosts que me interesan también se encuentran en ~/.ssh/config
. Aquí hay un script para Bash Completion que lee las entradas de ese archivo:
_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
Pon ese script en /etc/bash_completion.d/ssh
y luego fuente con el siguiente comando:
$ . /etc/bash_completion.d/ssh
Encontré esta guía invaluable y no habría podido escribir esto sin él. Gracias Steve Kemp por escribir esa excelente guía!
No dice qué distribución está utilizando, pero en mi sistema Fedora 19 tengo instalado el siguiente paquete, bash-completion
que proporciona esta función a través de este archivo de reglas de finalización:
/usr/share/bash-completion/completions/ssh
Aquí está el paquete que he instalado:
$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch
Si mira a través de ese archivo de reglas, verá las estrofas que interrogan al $HOME/.ssh/config
archivo:
$ 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"
También encontré este Gist, known_hosts_autocomplete.sh , que hace algo similar excepto con el $HOME/.ssh/known_hosts
archivo.
# 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
Podrías hacer algo similar con tu $HOME/.ssh/config
archivo si por alguna razón no puede encontrar el archivo de regla de finalización para ssh
ya preenvasado.
Descubrí que el autocompletado no funcionaba porque Ubuntu hackea hosts conocidos. Puedes añadir
Host *
HashKnownHosts no
Para usted .ssh/config
archivo, pero los hosts existentes no se eliminarán.
Para habilitar el autocompletado ssh en Debian y Ubuntu:
Sudo apt-get install bash-completion
Tenga en cuenta que esto tiene nada en absoluto con hash conocido_hosts, contrario a lo que se indicó anteriormente y la pregunta original. Si desea completar automáticamente desde conocido_hosts, entonces, por supuesto, tendría que deshabilitar el hashing, pero eso es fuertemente recomendado.
Por ejemplo, tengo:
Host *
HashKnownHosts yes
en mi .ssh/config, y todavía tengo la finalización automática de ssh funcionando muy bien contra los hosts enumerados en .ssh/config y/etc/hosts. Es necesario agregar el Host a .ssh/config como lo indica el OP:
Host my-awesome-Host Nombre de host the.real.Host.name
(O bien, puede agregar una entrada de Host a/etc/hosts, que es otra fuente para los scripts de Debian/Ubuntu).
Luego, puede escribir ssh my-awe<tab>
y se completará automáticamente. De nuevo, esto es incluso si tienes HashKnownHosts, lo cual es muy recomendable. (Tenga en cuenta que la finalización de bash debe estar habilitada en su Shell de bash, y debe tener específicamente esos scripts instalados como se indica arriba para su distribución).
Luego, agregue estas líneas a su .bashrc
para habilitarlo (requiere cerrar sesión y volver a iniciar sesión, o simplemente un nuevo bash
ingresado para iniciar un nuevo Shell. (No necesita habilitarlo si ya está habilitado en /etc/bash.bashrc
y /etc/profile
fuentes /etc/bash.bashrc
).
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
Esto habilitará el autocompletado ssh (¡entre otras cosas!) Desde ~/.ssh/config
, /etc/hosts
, etc.
Tenga en cuenta que Debian por defecto es ash en lugar de bash. Puedes cambiar a bash fácilmente:
Sudo usermod -s /bin/bash "$USER"
(Deberá cerrar sesión y volver a iniciarla para que esto surta efecto).
En Ubuntu 14.04, ssh
completa automáticamente los servidores mencionados en su ~/.ssh/config
Me di cuenta cuando me di cuenta de que solo uno de los servidores a los que comúnmente accedo se completa automáticamente. La única diferencia entre los dos era una entrada en el archivo de configuración ssh relacionada con la autenticación. Cuando agregué una nueva entrada al archivo de configuración para el otro servidor, también comenzó a completarse automáticamente.
Aquí está la entrada para los que preguntaban:
Host server-name
GSSAPIAuthentication=no
Me sorprendería mucho si importara lo que estaba especificando en la configuración (siempre que siga siendo válido, por supuesto).