Eu escrevi este guia de duas partes há um tempo atrás:
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ê.
(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
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.)
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.
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
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.
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