Función de finalización automática de Bash para SSHing en diferentes hosts

8

Tengo una gran lista de servidores que normalmente hago sshtodo el tiempo. ¿Hay alguna forma de usar basho zshpara que pueda mantener la lista de nombres de host y la finalización automática de bash revisa el archivo y me sugiere sugerencias para los cuadros que comienzan con esas letras cada vez que escribo las primeras letras del nombre de host.

Pradeepchhetri
fuente

Respuestas:

8

Zshla finalización funciona con los llamados marcadores ssh. Estas son configuraciones por host en ~/.ssh/config.

Por ejemplo,

  host baz
    hostname 192.168.1.2
    port 22
    user warrick

  host bar
    hostname example.com
    port 2200
    user kevin
    identityfile /home/warrick/.ssh/ec2.pem

man ssh_config para ver una lista completa de opciones.

EDITAR

Estoy usando el script de finalización de ohmyzsh :

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

En un estilo similar a ohmyzsh, puse el script anterior ~/.zsh/libs/completion.zshy agregué esto a ~/.zshrc.

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done
kwarrick
fuente
No uso zsh pero bash ...
Gilles Quenot
Correcto, la pregunta de OPs es para bash o zsh, mi comentario en su publicación fue simplemente para favorecer ~ / .ssh / config a / etc / hosts si es posible, lo que según su pregunta es posible cuando se usa zsh.
kwarrick
6

Copiado de mi propia respuesta en unix.SE :

Si está en un host de Ubuntu, debe saber que en Ubuntu las entradas en ~/.ssh/known_hostshash , por lo que la finalización de SSH no puede leerlas. Esto es una característica, no un error. Incluso mediante la adición HashKnownHosts noa ~/.ssh/config, y /etc/ssh/ssh_configno pude evitar que el hash de acogida.

Sin embargo, puede leer las entradas configuradas ~/.ssh/config, que no están en hash. 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 | awk '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

Ponga ese script /etc/bash_completion.d/sshy luego fuente con el siguiente comando:

$ . /etc/bash_completion.d/ssh

Encontré esta guía invaluable y no habría podido escribir esto sin ella. ¡Gracias Steve Kemp por escribir esa excelente guía!

dotancohen
fuente
2
+1, pero reemplazaría la línea awk opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')porque la ~/.ssh/configsintaxis permite varios nombres en una sola línea
nath
@nhed: ¡Gracias! No sabía que estaba permitido.
dotancohen
0

Para que esto funcione, coloque los hosts que desee completar en su /etc/hostsarchivo.

También necesita el bash-completionpaquete (que contiene el archivo / etc / bash_completion y el directorio /etc/bash_completion.d)

y la fuente en ~ / .bashrc ( . /etc/bash_completion- a veces se comenta en /etc/bash.bashrc o en ~ / .bashrc).

Gilles Quenot
fuente
44
Recomiendo no usar / etc / hosts. En su lugar, agregue los llamados marcadores ssh en ~ / .ssh / config. man ssh_configpara más detalles, pero es mucho más versátil, lo que le permite especificar múltiples alias, nombre de usuario, puerto y mucho más.
kwarrick
Con archlinux, cuando pongo algo /etc/ssh/ssh_config, no tengo terminación de trabajar para los hosts configurados.
Gilles Quenot
Vea mi respuesta extendida, estoy usando completar desde ohmyzsh.
kwarrick
1
Si observa la fuente , verá que la secuencia de comandos verifica known_hoststan bien como los otros archivos de configuración, por ejemplo,~/.ssh/config
jasonwryan