завершение вкладки для идентификаторов

Очень часто мне нужно использовать идентификатор для команды. Например,

ssh server1-name

Очевидно, что если я должен был нажать [tab] при вводе server1, то часть -name идентификатора строки не будет завершена. Есть ли способ в bash, чтобы заставить это работать?

Он явно работает для других идентификаторов, таких как имена каталогов. то есть

cd /var/www/ht[tab] приведет к cd /var/www/html, есть ли причина, по которой он не работает для таких вещей, как ssh?

1
задан 8 November 2017 в 19:54

3 ответа

Элементы в ~/.ssh/known_hosts хэшированы и поэтому не могут быть прочитаны bash-completion, см. эту ошибку и аналогичный вопрос в Unix.SE.

В качестве обходного пути существует эта ошибка (см. также комментарии) для ~/.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 $2}'
                `
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

Другую попытку обойти эту проблему можно найти здесь здесь :

]
_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

К сожалению, я не могу проверить это прямо сейчас, но вы можете просто попробовать их обоих. Второй выглядит намного проще для меня, я ожидаю, что он будет работать быстрее.

2
ответ дан 22 May 2018 в 16:24
  • 1
    Спасибо, что второй скрипт оболочки выглядит намного более кратким и с очень незначительной настройкой, я смог заставить его работать. Возможно, вам стоит изменить скрипт, чтобы проверить, существует ли ~/.ssh/config или ~/.ssh/config.d. – Mark D 8 November 2017 в 21:40

Элементы в ~/.ssh/known_hosts хэшированы и поэтому не могут быть прочитаны bash-completion, см. эту ошибку и аналогичный вопрос в Unix.SE.

В качестве обходного пути существует эта ошибка (см. также комментарии) для ~/.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 $2}' ` COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur)) return 0 } complete -F _complete_ssh_hosts ssh

Другую попытку обойти эту проблему можно найти здесь здесь :

] _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

К сожалению, я не могу проверить это прямо сейчас, но вы можете просто попробовать их обоих. Второй выглядит намного проще для меня, я ожидаю, что он будет работать быстрее.

2
ответ дан 18 July 2018 в 03:38

Элементы в ~/.ssh/known_hosts хэшированы и поэтому не могут быть прочитаны bash-completion, см. эту ошибку и аналогичный вопрос в Unix.SE.

В качестве обходного пути существует эта ошибка (см. также комментарии) для ~/.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 $2}' ` COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur)) return 0 } complete -F _complete_ssh_hosts ssh

Другую попытку обойти эту проблему можно найти здесь здесь :

] _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

К сожалению, я не могу проверить это прямо сейчас, но вы можете просто попробовать их обоих. Второй выглядит намного проще для меня, я ожидаю, что он будет работать быстрее.

2
ответ дан 24 July 2018 в 17:53

Другие вопросы по тегам:

Похожие вопросы: