Uzupełnianie tabulatorów dla hostów zdefiniowanych w ~ / .ssh / config nie działa już w Yosemite

38

Próbuję utworzyć ~/.ssh/configplik, aby uprościć życie w połączeniu z serwerem.

W Mavericks wszystko działało poprawnie, a dzięki tabI mogłem automatycznie uzupełnić nazwę hosta za pomocą pliku takiego:

Host test-host-name
    HostName 192.168.1.2
    User root

Ta sama konfiguracja w Yosemite ma inne zachowanie. Kiedy piszę ssh tw powłoce tab, nie uzupełnia automatycznie nazwy hosta.

Czy ktoś wie, czy coś się zmieniło w Yosemite, a teraz muszę coś zrobić, aby to zadziałało?

RikyTres
źródło

Odpowiedzi:

37

Możesz włączyć uzupełnianie powłoki bash, instalując bash-completionprzez brew :

brew install bash-completion

Następnie dodaj następujące elementy do ~/.bash_profile:

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

Źródło

(Edycja: brew tap homebrew/completionsjest przestarzała od 2018 r.)

Danny Armstrong
źródło
+1 :) Podczas instalacji bash-complete-1.3.3.high_sierra, mówi mi, że powinienem dodać [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Czy możesz wyjaśnić, która wersja (ta lub Twoja) powinna być preferowana i dlaczego?
Jan Nash,
15

Zakładam, że powłoka twojego Maca to bash.

Musisz wykonać polecenie ssh, aby uzyskać więcej informacji, które możesz przeczytać 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

Nie zapomnij, że potrzebujesz sourcepliku, aby nowe polecenie załadowało się do terminala. lub Możesz umieścić ten kod w .bash_profile

nelson
źródło
Tak, skorupa to bash. Dlaczego w Maveriks nie musiałem tego robić?
RikyTres
Nie, właśnie testowałem. Domyślnie nie mogę tego zrobić w Mavericks.
nelson
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")
Wstrzymano do odwołania.
2

Z tego artykułu na temat MacWorld .

Skopiuj / wklej następujące elementy do ~/.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

Następnie musisz ponownie uruchomić terminal lub wpisać source ~/.bash_profile(pamiętaj, że ten ostatni będzie działał tylko na bieżącej karcie).

wołowina_boolean
źródło
Nie działało dla mnie. Ale zrobiło to apple.stackexchange.com/a/168168/136365 . Myślę, że najlepiej jest unikać polegania na ruby ​​w takich przypadkach.
Ben Creasy
0

Do Twojej wiadomości, nie jestem pewien, jak odpowiedzieć bezpośrednio na odpowiedź Nelsona, ponieważ nie zbudowałem jeszcze wystarczającej reputacji, aby skomentować ją, ale na moim komputerze z El Capitan ^Mbył dołączany do wszystkich nazw hostów z mojego pliku konfiguracyjnego . Musiałem albo dodać \rdo mojej $IFSzmiennej, albo usunąć / podstawić wszystkie wystąpienia \rz wyjścia drugiego cat. Na koniec zrobiłem to drugie, dodając, tr '\r' '\n'aby ten łańcuch poleceń wyglądał tak:

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'
Ian Bui
źródło
-1

Możesz dodawać wpisy do / etc / hosts i używać ich w autouzupełnianiu nazw hostów:

"ssh @" + [TAB]

Ponowne uruchomienie jest wymagane, aby system mógł ponownie załadować ten plik.

lukdz
źródło