Autocomplete nomes de servidores para SSH e SCP

49

Eu tenho alguns servidores configurados em ~/.ssh/config , como alpha e beta . Como posso configurar o Bash de forma que os comandos ssh al<tab> e scp file.tgz al<tab> completem automaticamente os nomes dos servidores configurados?

Eu não quero adicionar os servidores a outro arquivo (ou seja, uma matriz Bash) cada vez que um é adicionado, como adicionar e remover servidores regularmente e a lista é bastante grande.

    
por dotancohen 10.06.2014 / 09:13

5 respostas

55

Encontrou-o !!

Parece que no Ubuntu as entradas em ~/.ssh/known_hosts são hashed , então 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, os hosts nos quais estou interessado também são encontrados em ~/.ssh/config . 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 ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 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:46
16

Pré-embalados

Você não diz qual distro está usando, mas no meu sistema Fedora 19 eu tenho o seguinte pacote instalado, bash-completion que fornece este recurso através deste arquivo de regras de conclusão:

/usr/share/bash-completion/completions/ssh

Aqui está o pacote que eu instalei:

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

Se você observar esse arquivo de regras, verá estrofes que estão interrogando o arquivo $HOME/.ssh/config :

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

Rolando seu próprio

Eu também encontrei essa essência, known_hosts_autocomplete.sh , que faz algo semelhante, exceto com o arquivo $HOME/.ssh/known_hosts .

# add to ~/.bash_profile, and close/reopen a shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo 'cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["';)" ssh

Você pode fazer algo semelhante usando o arquivo $HOME/.ssh/config se, por algum motivo, não conseguir encontrar o arquivo de regras de conclusão para ssh já pré-empacotado.

    
por 10.06.2014 / 09:33
5

Descobri que o preenchimento automático não estava funcionando porque o Ubuntu hashes hosts conhecidos. Você pode adicionar

Host *
    HashKnownHosts no

Para o seu arquivo .ssh/config , mas os hosts existentes não serão alterados.

    
por 28.01.2015 / 16:08
2

No Ubuntu 14.04, ssh conclui automaticamente os servidores mencionados em seu ~/.ssh/config

Eu percebi isso quando percebi que apenas um dos servidores geralmente acessa o preenchimento automático. A única diferença entre os dois era uma entrada no arquivo de configuração ssh relacionada à autenticação. Quando adicionei uma nova entrada ao arquivo de configuração para o outro servidor, ela também foi iniciada automaticamente.

Aqui está a entrada para aqueles que perguntaram:

HOST server-name 
    GSSAPIAuthentication=no

Eu ficaria muito surpreso se importasse o que você estava especificando na configuração (contanto que ainda seja válido, é claro).

    
por 03.04.2015 / 19:10
2

Para ativar o autocompletar ssh no Debian e no Ubuntu:

sudo apt-get install bash-completion

Note que isso não tem nada a ver com o hashing known_hosts, ao contrário do que foi dito acima e da pergunta original. Se você quisesse autocompletar a partir de known_hosts, então, claro, você teria que desabilitar o hash, mas isso é strongmente recomendado contra.

Por exemplo, eu tenho:

Host *
    HashKnownHosts yes

no meu .ssh / config, e ainda tenho o preenchimento automático do ssh funcionando bem com os hosts listados em .ssh / config e / etc / hosts. Você precisa adicionar o host a .ssh / config como o OP declarou:

Host my-awesome-host     Nome do host the.real.host.name

(Ou, você pode adicionar uma entrada de host ao / etc / hosts, que é outra fonte para os scripts Debian / Ubuntu.)

Depois, você pode digitar ssh my-awe<tab> e será preenchido automaticamente. Novamente, isso é mesmo se você tiver HashKnownHosts, o que é altamente recomendado. (Observe que a conclusão do bash precisa ser ativada em seu shell bash e você precisa especificamente ter esses scripts instalados como acima para sua distribuição.)

Em seguida, adicione essas linhas ao seu .bashrc para ativá-lo (requer um logout e login novamente, ou apenas um novo bash digitado para ativar um novo shell. (Você não precisa ativar se for já ativado em /etc/bash.bashrc e /etc/profile sources /etc/bash.bashrc ).

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

Isso ativará o preenchimento automático de ssh (entre outras coisas!) de ~/.ssh/config , /etc/hosts , etc.

Note que o padrão Debian é ash em vez de bash. Você pode mudar para bash facilmente:

sudo usermod -s /bin/bash "$USER"

(Você precisará fazer logout e fazer login novamente para que isso entre em vigor.)

    
por 05.01.2017 / 18:43