conclusão da guia para identificadores

1

Muitas vezes, preciso usar um identificador para um comando. Por exemplo,

ssh server1-name

Obviamente, se eu atingisse [tab] ao digitar server1 , a parte -name do identificador de sequência não seria concluída. Existe uma maneira de fazer isso funcionar?

Funciona claramente para outros identificadores, como nomes de diretórios. ou seja,

cd /var/www/ht[tab] resultará em cd /var/www/html há algum motivo para não funcionar para coisas como ssh?

    
por Mark D 08.11.2017 / 16:54

1 resposta

2

As entradas em ~/.ssh/known_hosts estão com hash e, portanto, não podem ser lidas por bash-completion , consulte este bug e uma pergunta semelhante no Unix.SE .

Como solução alternativa, há este script (veja também aqui para comentários) para ~/.profile :

_complete_ssh_hosts ()
{
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        comp_ssh_hosts='cat ~/.ssh/known_hosts | \
                        cut -f 1 -d ' ' | \
                        sed -e s/,.*//g | \
                        grep -v ^# | \
                        uniq | \
                        grep -v "\[" ;
                cat ~/.ssh/config | \
                        grep "^Host " | \
                        awk '{print }'
                '
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

Outra tentativa de contornar esse problema pode ser encontrada nesta resposta no Unix.SE :

_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/* | grep -v '[?*]' | cut -d ' ' -f 2-)
    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

Infelizmente, não posso testá-lo agora, mas você pode experimentar os dois. O segundo parece muito mais simples para mim, eu esperaria que ele fosse mais rápido.

    
por dessert 08.11.2017 / 17:00