Como posso corrigir este script de conclusão da guia de nome de host SSH?

6

Eu encontrei o seguinte script (para o bash) que me permite obter a conclusão da tabulação para qualquer hostname Eu me conectei a (de ~/.ssh/known_hosts ):

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

No entanto, o problema é que a conclusão da tabulação não funciona depois que eu digitei um nome de usuário.

Como posso melhorar isso, se eu digitar ...

ssh myusername@my 

e espera que ele complete "myhostname.com", ele será capaz de fazer isso?

Seria ainda melhor se ele pudesse tabar strings inteiras (user @ hostname) também, mas eu posso viver com qualquer opção. Sem o primeiro, isso não é muito útil, a menos que meu nome de usuário do host corresponda ao nome de usuário local.

    
por Nicole 11.06.2013 / 18:52

2 respostas

2

O arquivo known_hosts por padrão geralmente contém entradas hash que o bash_completion não pode analisar.

Você pode editar seu ssh_config (/ etc / ssh / ssh_config) para definir:

HashKnownHosts no

Em seguida, você provavelmente precisará limpar seu arquivo atual de hosts conhecidos:

> ~/.ssh/known_hosts
    
por 12.09.2013 / 19:17
1

Se $COMP_WORDBREAKS contém "@" (isto é o padrão no meu sistema) então sérios problemas surgem que eu não pude resolver (depois de pressionar Tab e Enter um "@" foi removido).

Mas, se você excluí-lo dessa variável de ambiente, isso funciona:

_foo () {
  if [[ "$COMP_WORDBREAKS" =~ "@" ]]; then
    echo ""
    echo '$COMP_WORDBREAKS contains "@"; aborting'
    COMPREPLY=()
  else
    at_in=no
    if [[ ${COMP_WORDS[COMP_CWORD]} =~ "@" ]]; then
      var="${COMP_WORDS[COMP_CWORD]}"
      tail="${var#*@}"
      prefix="${var%"$tail"}"
    else
      prefix=""
    fi
    COMPREPLY=($(cut -f 1 -d ' ' <~/.ssh/known_hosts |
      sed -e 's/,/\n/g' | uniq |
      awk -v prefix="${prefix}" '/\[/ {next}; {print prefix $0;}'))
    COMPREPLY=($(compgen -W "${COMPREPLY[*]}" "${COMP_WORDS[COMP_CWORD]}"))
  fi
}

complete -F _foo ssh
    
por 12.06.2013 / 05:58