La finalización de la pestaña para los hosts definidos en ~ / .ssh / config ya no funciona en Yosemite

38

Estoy tratando de crear mi ~/.ssh/configarchivo para simplificar mi vida laboral en la conexión del servidor.

En Mavericks todo funcionó correctamente y con el tabpude completar automáticamente el nombre de host con un archivo como este:

Host test-host-name
    HostName 192.168.1.2
    User root

La misma configuración en Yosemite tiene un comportamiento diferente. Cuando escribo ssh ten el shell tab, no completa automáticamente el nombre de host.

¿Alguien sabe si algo ha cambiado en Yosemite y ahora tengo que hacer algo para que funcione?

RikyTres
fuente

Respuestas:

37

Puede habilitar la finalización de bash shell instalando a bash-completiontravés de brew :

brew install bash-completion

Luego agregue lo siguiente a su ~/.bash_profile:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi

Fuente

(Editar: brew tap homebrew/completionsestá en desuso a partir de 2018).

Danny Armstrong
fuente
+1 :) Al instalar bash-completar-1.3.3.high_sierra, me dice que debo agregar [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. ¿Podría explicar qué versión (esa o la suya) debería preferirse y por qué?
Jan Nash
15

Supongo que la carcasa de tu Mac es bash.

Necesita completar el comando ssh, para más detalles puede leer 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

No olvide que necesita sourceel archivo para obtener el nuevo comando para cargar en su terminal. o puede poner este código en .bash_profile

nelson
fuente
Sí, el caparazón es bash. ¿Por qué en Maveriks no necesitaba hacer estas cosas?
RikyTres
No, lo he probado justo ahora. No puedo hacer eso en Mavericks por defecto.
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")
Pausado hasta nuevo aviso.
2

De este artículo en MacWorld .

Copie / pegue lo siguiente en ~/.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

Luego deberá reiniciar su terminal o escribir source ~/.bash_profile(tenga en cuenta que este último solo funcionará en su pestaña actual).

carne booleana
fuente
No funciono para mi. Pero apple.stackexchange.com/a/168168/136365 sí. Creo que es mejor evitar depender del rubí para algo como esto.
Ben Creasy
0

Para su información, no estoy seguro de cómo responder directamente a la respuesta de Nelson, ya que aún no he acumulado suficiente reputación para comentarlo, pero en mi máquina que ejecuta El Capitan, ^Mse estaba agregando a todos los nombres de host de mi archivo de configuración . Tuve que agregar \ra mi $IFSvariable o eliminar / sustituir todas las instancias de \rla salida del segundo cat. Al final, hice lo último agregando tr '\r' '\n'para hacer que la cadena de comandos se vea así:

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'
Ian Bui
fuente
-1

Puede agregar entradas en / etc / hosts y usarlas en autocompletar nombre de host:

"ssh @" + [TAB]

Se requiere reiniciar para que el sistema vuelva a cargar este archivo.

lukdz
fuente