Fitur Bash Auto-Completion untuk SSHing ke Berbagai Host

8

Saya memiliki daftar besar server yang biasanya saya miliki sshsepanjang waktu. Apakah ada cara menggunakan bashatau zshagar saya dapat menyimpan daftar nama host dan bash penyelesaian otomatis melalui file dan memberi saya saran untuk kotak yang dimulai dengan huruf-huruf itu setiap kali saya mengetik beberapa huruf pertama dari nama host.

pradeepchhetri
sumber

Jawaban:

8

Zshpenyelesaian bekerja dengan penanda ssh. Ini adalah konfigurasi per host di ~/.ssh/config.

Sebagai contoh,

  host baz
    hostname 192.168.1.2
    port 22
    user warrick

  host bar
    hostname example.com
    port 2200
    user kevin
    identityfile /home/warrick/.ssh/ec2.pem

man ssh_config untuk melihat daftar opsi lengkap.

EDIT

Saya menggunakan skrip penyelesaian dari ohmyzsh :

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

Dalam gaya serupa ohmyzsh, saya menempatkan skrip di atas ke dalam ~/.zsh/libs/completion.zshdan menambahkan ini ke ~/.zshrc.

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done
kwarrick
sumber
Saya tidak menggunakan zsh tapi bash ...
Gilles Quenot
Benar, pertanyaan OP adalah untuk bash atau zsh, komentar saya pada posting Anda hanya untuk mendukung ~ / .ssh / config ke / etc / hosts jika memungkinkan, yang sesuai dengan pertanyaannya adalah mungkin saat menggunakan zsh.
kwarrick
6

Disalin dari jawaban saya sendiri di unix.SE :

Jika Anda menggunakan host Ubuntu, maka Anda harus tahu bahwa di Ubuntu entri di ~/.ssh/known_hostshash , sehingga penyelesaian SSH tidak dapat membacanya. Ini adalah fitur, bukan bug. Bahkan dengan menambahkan HashKnownHosts noke ~/.ssh/configdan /etc/ssh/ssh_configsaya tidak dapat mencegah hashing tuan rumah.

Namun, Anda dapat membaca entri yang dikonfigurasi dari ~/.ssh/config, yang bukan hash. Berikut ini adalah skrip untuk Bash Completion yang membaca entri dari file itu:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config | awk '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

Masukkan script itu /etc/bash_completion.d/sshdan kemudian sumber dengan perintah berikut:

$ . /etc/bash_completion.d/ssh

Saya menemukan panduan ini sangat berharga dan saya tidak akan dapat menulis tanpa ini. Terima kasih Steve Kemp untuk menulis panduan hebat itu!

dotancohen
sumber
2
+1 tetapi saya akan mengganti baris awk dengan opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')karena ~/.ssh/configsintaksnya memungkinkan untuk beberapa nama pada satu baris
nhed
@nhed: Terima kasih! Saya tidak tahu itu diizinkan.
dotancohen
0

Agar ini berfungsi, masukkan semua host yang ingin Anda selesaikan dalam /etc/hostsfile Anda .

Anda juga perlu bash-completionmengemas (berisi file / etc / bash_completion dan direktori /etc/bash_completion.d)

dan sumbernya di ~ / .bashrc ( . /etc/bash_completion- terkadang dikomentari di /etc/bash.bashrc atau di ~ / .bashrc).

Gilles Quenot
sumber
4
Saya akan merekomendasikan untuk tidak menggunakan / etc / hosts. Alih-alih tambahkan bookmark ssh yang disebut di ~ / .ssh / config. man ssh_configuntuk detail lebih lanjut, tetapi jauh lebih fleksibel memungkinkan Anda untuk menentukan beberapa alias, nama pengguna, port, dan banyak lagi.
kwarrick
Dengan archlinux, ketika saya memasukkan sesuatu /etc/ssh/ssh_config, saya tidak memiliki penyelesaian yang bekerja untuk host yang dikonfigurasi.
Gilles Quenot
Lihat jawaban saya yang diperluas, saya menggunakan penyelesaian dari ohmyzsh.
kwarrick
1
Jika Anda melihat sumbernya , Anda akan melihat bahwa skrip memeriksa known_hostsserta file konfigurasi lainnya, misalnya.,~/.ssh/config
jasonwryan