Recurso de conclusão automática do Bash para SSHing em diferentes hosts

8

Eu tenho uma grande lista de servidores que eu normalmente sshpara o tempo todo. Existe alguma maneira de usar bashou zshpara que eu possa manter a lista de nome do host e o preenchimento automático do bash percorrer o arquivo e me fornecer sugestões para as caixas que começam com essas letras sempre que eu digitar as primeiras letras do nome do host.

pradeepchhetri
fonte

Respostas:

8

ZshA conclusão funciona com os chamados marcadores ssh. Essas 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 :

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

Em estilo semelhante ao ohmyzsh, coloquei o script acima ~/.zsh/libs/completion.zshe o adicionei ~/.zshrc.

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done
kwarrick
fonte
Não uso zsh mas o bash ...
Gilles Quenot
Certo, a questão dos OPs é para bash ou zsh, meu comentário no seu post foi simplesmente favorecer ~ / .ssh / config para / etc / hosts, se possível, o que, de acordo com a pergunta dele, é possível ao usar o zsh.
Kwarrick #
6

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

Se você estiver em um host Ubuntu, deverá saber que no Ubuntu as entradas ~/.ssh/known_hostssão hash , para que a conclusão do SSH não possa lê-las. Este é um recurso, não um bug. Mesmo adicionando HashKnownHosts noao ~/.ssh/confige /etc/ssh/ssh_configeu era incapaz de impedir o hashing host.

No entanto, você pode ler as entradas configuradas de ~/.ssh/config, que não são hash. Aqui está um script para o 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 /etc/bash_completion.d/sshe origine-o com o seguinte comando:

$ . /etc/bash_completion.d/ssh

Achei este guia inestimável e eu não seria capaz de escrever isso sem ele. Obrigado Steve Kemp por escrever esse guia fantástico!

dotancohen
fonte
2
+1, mas eu substituiria a linha awk opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')porque a ~/.ssh/configsintaxe permite vários nomes em uma única linha
encerrada
@ nhed: Obrigado! Eu não sabia que isso era permitido.
dotancohen
0

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

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

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

Gilles Quenot
fonte
4
Eu recomendaria não usar o / etc / hosts. Em vez disso, adicione os chamados marcadores ssh em ~ / .ssh / config. man ssh_configpara obter mais detalhes, mas é muito mais versátil, permitindo especificar vários aliases, nome de usuário, porta e muito mais.
Kwarrick 5/10/12
Com o archlinux, quando coloco algo /etc/ssh/ssh_config, não tenho conclusão trabalhando para os hosts configurados.
Gilles Quenot
Veja minha resposta estendida, estou usando a conclusão de ohmyzsh.
Kwarrick 5/05
1
Se você olhar para a fonte , você vai ver que os controlos de script known_hosts, bem como outros arquivos de configuração, por exemplo,.~/.ssh/config
jasonwryan