A conclusão da guia para hosts definidos em ~ / .ssh / config não funciona mais no Yosemite


38

Estou tentando criar meu ~/.ssh/configarquivo para simplificar minha vida profissional na conexão do servidor.

No Mavericks tudo funcionou corretamente e com o tabI foi capaz de completar automaticamente o nome do host com um arquivo como este:

Host test-host-name
    HostName 192.168.1.2
    User root

A mesma configuração no Yosemite tem um comportamento diferente. Quando digito ssh tno shell, o tabpreenchimento automático não é automático.

Alguém sabe se algo mudou em Yosemite e agora eu preciso fazer algo para fazê-lo funcionar?

Respostas:


37

Você pode ativar a conclusão do shell bash instalando bash-completionvia brew :

brew install bash-completion

Em seguida, adicione o seguinte ao seu ~/.bash_profile:

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

Fonte

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


+1 :) Ao instalar o bash-conclusão-1.3.3.high_sierra, ele diz que devo adicionar [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Você poderia elaborar qual versão (essa ou a sua) deve ser preferida e por quê?
Jan Nash

15

Presumo que o shell do seu Mac seja uma festança.

Você precisa concluir o comando ssh, para obter mais detalhes, pode ler 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

Não esqueça que você precisa sourcedo arquivo para obter o novo comando para carregar no seu terminal. ou Você pode colocar esse código em .bash_profile


Sim, a concha é uma festança. Por que no Maveriks eu não precisava fazer isso?
RikyTres

Não, eu testei agora. Não posso fazer isso no Mavericks por padrão.
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 até novo aviso.

2

Deste artigo no MacWorld .

Copie / cole o seguinte em ~/.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

Você precisará reiniciar o terminal ou digitar source ~/.bash_profile(observe que o último só funcionará na sua guia atual).


não funcionou para mim. Mas apple.stackexchange.com/a/168168/136365 conseguiu. Eu acho que é melhor evitar confiar em ruby ​​para algo assim.
Ben Creasy

0

Para sua informação, não tenho certeza de como responder diretamente à resposta de nelson, pois ainda não tenho reputação suficiente para comentar sobre ela, mas na minha máquina executando o El Capitan, ^Mestava sendo anexado a todos os nomes de host do meu arquivo de configuração . Eu tive que adicionar \rà minha $IFSvariável ou remover / substituir todas as instâncias da \rsaída da segunda cat. No final, eu fiz o último adicionando tr '\r' '\n'para fazer com que a cadeia de comando fique assim:

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

-1

Você pode adicionar entradas no / etc / hosts e usá-las no preenchimento automático do nome do host:

"ssh @" + [TAB]

É necessário reiniciar o sistema para recarregar esse arquivo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.