Recurso de Auto-Conclusão Bash para SSH em Hosts Diferentes

8

Eu tenho uma lista grande de servidores que eu normalmente ssh para o tempo todo. Existe alguma maneira de usar bash ou zsh para que eu possa manter a lista de hostname e bash auto-completion percorrer o arquivo e me dá sugestão para as caixas que começam com essas letras sempre que eu digito as primeiras letras do hostname.

    
por pradeepchhetri 05.10.2012 / 21:58

4 respostas

8

Zsh completion funciona com os chamados marcadores ssh. Estas são configurações por host em ~/.ssh/config .

Por exemplo,

  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 uma lista completa de opções.

EDITAR

Estou usando o script de conclusão de ohmyzsh :

link

Em estilo semelhante a ohmyzsh , coloquei o script acima em ~/.zsh/libs/completion.zsh e adicionei isso a ~/.zshrc .

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done
    
por 05.10.2012 / 22:59
9

O pacote conclusão do bash inclui conclusões para os comandos ssh , incluindo:

  • ssh
  • ssh-add
  • ssh-copy-id
  • sshfs

Você pode procurar a fonte aqui: link

    
por 05.10.2012 / 22:07
6

Copiado de minha própria resposta no unix.SE :

Se você está em um host Ubuntu, então você deve saber que no Ubuntu as entradas em ~/.ssh/known_hosts está com hash , portanto, a conclusão do SSH não pode lê-los. Este é 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. 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

Eu achei este guia inestimável e eu não teria sido capaz de roteirizar isso sem ele. Obrigado Steve Kemp por escrever esse guia fantástico!

    
por 28.01.2015 / 17:58
0

Para que isso funcione, coloque todos os hosts que você deseja concluir no seu arquivo /etc/hosts .

Você também precisa bash-completion package (contendo o arquivo / etc / bash_completion e o diretório /etc/bash_completion.d)

e digite-o em ~ / .bashrc ( . /etc/bash_completion - às vezes é comentado em /etc/bash.bashrc ou em ~ / .bashrc).

    
por 05.10.2012 / 22:39