Como editar a conclusão do comando para o ssh no bash?

3

(Eu fiz esta pergunta sobre zsh , mas eu também uso o bash e também acharia útil lá - como eu estou supondo que muitos outros também seriam úteis, já que o bash tem muito mais usuários que zsh.)

Gostaria de configurar o comando completion no bash para exibir nomes de host depois de digitar

ssh [TAB]

pegando os nomes do meu arquivo .ssh / config (e preferencialmente de known_hosts e / etc / hosts e qualquer outro lugar que faça sentido) e apresentando uma única lista.

Ele faz parte disso atualmente, mas

  1. não usa .ssh / config em todos
  2. requer primeiro um nome de usuário, mesmo que o uso de .ssh / config torne desnecessário digitar nomes de usuário
  3. apresenta várias listas (provavelmente uma de known_hosts e outra de / etc / hosts, mas eu não verifiquei isso)

Portanto, quero incluir nomes de usuários conhecidos, bem como nomes de hosts conhecidos na lista (de preferência, única) depois de digitar ssh [TAB]

(Eu estou chegando aqui antes do Google porque 1) isso resultará em uma resposta armazenada aqui e 2) é provavelmente mais eficiente. Se ninguém mais responder, eu procurarei a resposta.)

    
por iconoclast 13.08.2010 / 23:15

5 respostas

3

Eu escrevi este guia de duas partes há um tempo atrás:

link

link

Explica como você pode escrever scripts de conclusão - embora a resposta anterior indique o que você quer que já esteja disponível para você.

    
por 16.08.2010 / 22:28
2

Esta funcionalidade já é fornecida pela conclusão do bash. O arquivo atual, se você quiser editar sua funcionalidade, é /etc/bash_completion.d/ssh .

Isso é fornecido pelo pacote bash-completion .

Ao digitar ssh < TAB > ele listará todos os hosts em / etc / hosts e ~ / .ssh / config em uma lista.

Se você tiver o usuário especificado para um determinado host, não será necessário especificar isso ao usar o ssh.

Então, se você quiser ssh para servidor brandon

Digite ssh br < TAB > e deve autocompletar a palavra brandon contanto que o host esteja em / etc / hosts ou ~ / .ssh / config.

    
por 14.08.2010 / 00:43
2

Isso é o que eu tenho no meu .bashrc para conclusão do nome do host ssh:

SSH_COMPLETE=( $(cut -f1 -d' ' ~/.ssh/known_hosts |\
                 tr ',' '\n' |\
                 sort -u |\
                 grep -e '[:alpha:]') )
complete -o default -W "${SSH_COMPLETE[*]}" ssh
    
por 16.08.2010 / 22:54
1

Se você estiver em um mac, você pode usar o Homebrew para instalar o bash-completion:

brew install bash-completion

Adicione o seguinte para ~/.bash_profile

if [ -f /usr/local/etc/bash_completion ]; then
. /usr/local/etc/bash_completion
fi

Se você instalou o bash-completion com MacPorts, adicione isso ao bash_profile

if [ -f /opt/local/etc/bash_completion ]; then
. /opt/local/etc/bash_completion
fi

Agora você tem o pacote / funcionalidade que Richard Holloway estava falando.

    
por 23.05.2014 / 20:01
1

Se você está em uma máquina Ubuntu Server , então você deve saber que no Ubuntu as entradas em ~/.ssh/known_hosts estão com hash , portanto a conclusão do SSH não pode lê-las. Os desenvolvedores da Canonical consideram isso um recurso, não um bug. Mesmo adicionando HashKnownHosts no a ~/.ssh/config e /etc/ssh/ssh_config , não consegui impedir o hashing do host.

No entanto, você pode ler as entradas configuradas de ~/.ssh/config , que não estão com hash. Com base nos links da A resposta de Steve Kemp , aqui está um script para Bash Completion que lê as entradas desse arquivo:

_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

Coloque esse script em /etc/bash_completion.d/ssh e, em seguida, digite-o com o seguinte comando:

$ . /etc/bash_completion.d/ssh
    
por 17.09.2015 / 11:32