Завершення вкладки для хостів, визначених у ~ / .ssh / config, більше не працює на Yosemite


38

Я намагаюся створити свій ~/.ssh/configфайл для спрощення моєї роботи на сервері.

У Mavericks все працювало належним чином, і за допомогою tabI я змогла автоматично заповнити ім'я хоста таким файлом:

Host test-host-name
    HostName 192.168.1.2
    User root

Однакові конфігурації на Yosemite мають іншу поведінку. Коли я набираю ssh tоболонку, tabім'я хоста не заповнюється автоматично.

Хтось знає, чи щось змінилося в Йосеміті, і тепер мені потрібно щось зробити, щоб це спрацювало?

Відповіді:


37

Ви можете увімкнути заповнення оболонки bash, встановивши bash-completionза допомогою brew :

brew install bash-completion

Потім додайте до свого ~/.bash_profile:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi

Джерело

(Редагувати: brew tap homebrew/completionsзастаріло станом на 2018 рік.)


+1 :) Під час встановлення bash-завершення-1.3.3.high_sierra, він говорить мені, що я повинен додати [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Чи можете ви детальніше розглянути, якій версії (тієї чи вашої) слід віддати перевагу і чому?
Ян Неш

15

Я припускаю, що оболонка вашого Mac - це баш.

Вам потрібно виконати команду ssh, щоб отримати детальну інформацію man complete

_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

Не забудьте, що вам потрібно, щоб sourceфайл отримав нову команду для завантаження у ваш термінал. або Ви можете помістити цей код у .bash_profile


Так, шкаралупа бовтається. Чому в Маверику мені не потрібно було це робити?
RikyTres

Ні, я тестував саме зараз. Я не можу зробити це в Mavericks за замовчуванням.
Нельсон

comp_ssh_hosts=$(awk -F , 'FNR== NR && ! /^#|\[/ {field = $1} FNR != NR && /^Host / {field = $2} {hosts[field]} END {for (host in hosts) {print host}' "$HOME/.ssh/known hosts" "$HOME/.ssh/config")
Призупинено до подальшого повідомлення.

2

З цієї статті про MacWorld .

Скопіюйте / вставте наступне ~/.bash_profile:

complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh

Потім вам потрібно буде або перезапустити термінал або ввести source ~/.bash_profile(зауважте, що останній працюватиме лише у вашій поточній вкладці).


Не працювали для мене. Але apple.stackexchange.com/a/168168/136365 зробив. Я думаю, що краще уникати покладатися на рубін на щось подібне.
Бен Крізі

0

FYI, я не впевнений, як безпосередньо відповісти на відповідь Нельсона, оскільки я ще не створив достатньо репутації, щоб прокоментувати це, але на моїй машині, що працює під керуванням El Capitan, ^Mдодавались до всіх імен хостів із мого конфігураційного файлу . Мені довелося або додати \rдо моєї $IFSзмінної, або видалити / замінити всі екземпляри \rз виводу другого cat. Зрештою, я зробив останнє, додавши, tr '\r' '\n'щоб цей командний ланцюг виглядав так:

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'

-1

Ви можете додати записи в / etc / hosts та використовувати їх у автозаповнення імені хоста:

"ssh @" + [TAB]

Перезавантаження необхідна для того, щоб система перезавантажила цей файл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.