51 votos

La finalización del tabulador para los hosts definidos en ~/.ssh/config ya no funciona en Yosemite

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

En Mavericks todo funcionaba correctamente y con el tab Pude autocompletar 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 t en la cáscara el tab no autocompleta el nombre de host.

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

54voto

Aviral Kumar Puntos 123

Puedes habilitar la finalización del shell bash instalando bash-completion a través de cervecero :

brew install bash-completion

A continuación, añada 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/completions está obsoleto a partir de 2018).

1 votos

+1 :) Al instalar bash-completion-1.3.3.high_sierra, me dice que debo añadir [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion . ¿Podría explicar con más detalle qué versión (ésa o la suya) es preferible y por qué?

1 votos

@JanNash Eso es básicamente una versión de una sola línea de eso if arriba. Además, el $(brew --prefix) hará que funcione si su hombrew no está instalando a /usr/local . Debe utilizar la versión publicada como respuesta.

20voto

nelson Puntos 1153

Supongo que el shell de tu Mac es bash.

Necesitas completar el comando ssh, para más detalles puedes 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 olvides que necesitas source el archivo para que el nuevo comando se cargue en su terminal. o Puede poner este código en .bash_profile

1 votos

Sí, el shell es bash. ¿Por qué en Maveriks no necesitaba hacer estas cosas?

0 votos

No, lo he probado ahora mismo. No puedo hacerlo en Mavericks por defecto.

0 votos

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

4voto

beef_boolean Puntos 1

Desde 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

A continuación, tendrá que reiniciar su terminal o escribir source ~/.bash_profile (tenga en cuenta que esto último sólo funcionará en su pestaña actual).

0 votos

No me ha funcionado. Pero apple.stackexchange.com/a/168168/136365 lo hizo. Creo que es mejor evitar depender de Ruby para algo como esto.

1voto

Ian Bui Puntos 11

Para tu información, no estoy seguro de cómo responder directamente a la respuesta de nelson, ya que no he acumulado suficiente reputación para comentarlo todavía, pero en mi máquina corriendo El Capitan, ^M se añadía a todos los nombres de host de mi archivo de configuración. Tuve que añadir \r a mi $IFS o eliminar/sustituir todas las instancias de \r de la salida del segundo cat . Al final, hice esto último añadiendo tr '\r' '\n' para que la cadena de mando se vea así:

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

1voto

0xCAFED00D Puntos 11

La respuesta de Nelson (arriba) no te dice qué versión de MacOS está usando.

Para MacOS 10.14, después de instalar bash-completion con:

brew install bash-completion

El instalador me dijo que añadiera esta línea a mi .bash_profile (que en cambio puse en mi .profile) y funcionó:

  [[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X