desarrollo-web-br-bd.com

Autocompletar nombres de servidor para SSH y SCP

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.

67
dotancohen

¡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!

72
dotancohen

Preenvasado

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"

Rodando el tuyo

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.

16
slm

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.

9
M1ke

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

5
Jamieson Becker

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

3
Noah