Завершение вкладки для хостов, определенных в ~ / .ssh / config, больше не работает на Yosemite

38

Я пытаюсь создать свой ~/.ssh/configфайл для упрощения моей работы на сервере.

В Mavericks все работало правильно, и с помощью tabя был в состоянии автоматически заполнить имя хоста с файлом, как это:

Host test-host-name
    HostName 192.168.1.2
    User root

Та же конфигурация на Yosemite имеет другое поведение. Когда я печатаю ssh tна оболочке, tabимя хоста не заполняется автоматически.

Кто-то знает, если что-то изменилось в Йосемити, и теперь мне нужно что-то сделать, чтобы это работало?

RikyTres
источник

Ответы:

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 - bash.

Вам необходимо выполнить команду 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

нельсон
источник
Да, оболочка bash. Почему в Маверикс мне не нужно было делать это?
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(обратите внимание, что последний будет работать только на вашей текущей вкладке).

beef_boolean
источник
Не работал для меня. Но apple.stackexchange.com/a/168168/136365 сделал. Я думаю, что лучше избегать полагаться на ruby ​​для чего-то подобного.
Бен Криси
0

К вашему сведению, я не уверен, как ответить непосредственно на ответ Нельсона, так как я еще не набрал достаточно репутации, чтобы комментировать его, но на моей машине с 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]

Перезагрузка требуется для системы, чтобы перезагрузить этот файл.

lukdz
источник