Penyelesaian tab untuk host yang didefinisikan dalam ~ / .ssh / config tidak berfungsi lagi di Yosemite


38

Saya mencoba membuat ~/.ssh/configfile saya untuk menyederhanakan kehidupan kerja saya di koneksi server.

Di Mavericks semuanya bekerja dengan baik dan dengan tabsaya dapat melengkapinya secara otomatis hostname dengan file seperti ini:

Host test-host-name
    HostName 192.168.1.2
    User root

Konfigurasi yang sama pada Yosemite memiliki perilaku yang berbeda. Ketika saya mengetikkan ssh tshell, tabtidak melengkapi nama host secara otomatis.

Apakah ada yang tahu jika ada sesuatu yang berubah di Yosemite dan sekarang saya perlu melakukan sesuatu untuk membuatnya berfungsi?

Jawaban:


35

Anda dapat mengaktifkan penyelesaian bash shell dengan menginstal bash-completionmelalui minuman :

brew install bash-completion

Kemudian tambahkan yang berikut ke Anda ~/.bash_profile:

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

Sumber

(Edit: brew tap homebrew/completionssudah usang pada 2018.)


+1 :) Saat memasang bash-completion-1.3.3.high_sierra, ini memberitahu saya bahwa saya harus menambahkan [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Bisakah Anda menguraikan versi mana (itu atau milik Anda) yang harus dipilih dan mengapa?
Jan Nash

15

Saya menganggap shell Mac Anda adalah bash.

Anda perlu menyelesaikan perintah ssh, untuk lebih jelasnya Anda bisa membaca 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

Jangan lupa Anda perlu sourcefile untuk mendapatkan perintah baru untuk memuat di terminal Anda. atau Anda dapat meletakkan kode ini di .bash_profile


Yap, shellnya bash. Mengapa di Maveriks saya tidak perlu melakukan hal ini?
RikyTres

Tidak, saya baru saja diuji. Saya tidak bisa melakukan itu di Mavericks secara default.
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")
Dennis Williamson

2

Dari artikel ini di MacWorld .

Salin / rekatkan yang berikut ini ke ~/.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

Anda kemudian harus me-restart terminal atau tipe Anda source ~/.bash_profile(perhatikan bahwa yang terakhir hanya akan bekerja di tab Anda saat ini).


Tidak bekerja untuk saya. Tetapi apple.stackexchange.com/a/168168/136365 melakukannya. Saya pikir yang terbaik adalah menghindari mengandalkan ruby ​​untuk sesuatu seperti ini.
Ben Creasy

0

FYI, saya tidak yakin bagaimana menjawab langsung jawaban nelson karena saya belum membangun cukup reputasi untuk mengomentarinya, tetapi pada mesin saya yang menjalankan El Capitan, ^Msedang ditambahkan ke semua nama host dari file konfigurasi saya . Saya harus menambahkan \rke $IFSvariabel saya atau menghapus / mengganti semua contoh dari \routput yang kedua cat. Pada akhirnya, saya melakukan yang terakhir dengan menambahkan tr '\r' '\n'agar rantai perintah itu terlihat seperti ini:

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

-1

Anda dapat menambahkan entri di / etc / hosts dan menggunakannya dalam nama host autocomplete:

"ssh @" + [TAB]

Reboot diperlukan sistem untuk memuat ulang file ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.