Saya memiliki beberapa server yang berubah-ubah dengan kombinasi user / pass yang sama. Saya ingin menulis skrip (yang saya panggil sekali) sehingga
ssh-copy-id user@myserver
dipanggil untuk setiap server. Karena mereka semua memiliki pengguna yang sama / lulus ini harus mudah tetapi ssh-copy-id
ingin saya mengetikkan kata sandi secara terpisah setiap kali yang mengalahkan tujuan skrip saya. Tidak ada opsi untuk memasukkan kata sandi, yaitu ssh-copy-id -p mypassword user@myserver
.
Bagaimana saya bisa menulis skrip yang secara otomatis mengisi kolom kata sandi ketika ssh-copy-id
memintanya?
Jawaban:
Lihatlah sshpass . Tempatkan kata sandi Anda di file teks dan lakukan sesuatu seperti ini:
sumber
Anda dapat menggunakan harapkan untuk mendengarkan prompt kata sandi dan mengirim kata sandi Anda:
Simpan skrip, buat itu dapat dieksekusi, dan namakan seperti:
./login.expect user@myserver
sumber
spawn
? Untuk alasan saya tidak dapat mengontrol saya terjebak dengan bash v3.2.spawn: command not found
spawn
adalah kata kunci ekspektasi (lihat manual ekspektasi (1)). Kedengarannya seperti skrip sedang ditafsirkan sebagai shell daripada yang diharapkan. Apakah Anda berharap diinstal? Apa yang terjadi jika Anda menjalankan berharap secara langsung:expect -f login.expect user@myserver
spawn ssh-copy-id -o StrictHostKeyChecking=no $argv
Jawaban quanta cukup bagus, tetapi mengharuskan Anda memasukkan kata sandi dalam file teks.
Dari halaman manual "sshpass":
Jadi, yang dapat Anda lakukan adalah mengambil kata sandi satu kali selama skrip, menyimpannya dalam variabel, menggema kata sandi dan pipa itu untuk sshpass sebagai input.
Saya melakukan ini sepanjang waktu dan berfungsi dengan baik. Contoh:
echo "Please insert the password used for ssh login on remote machine:" read -r USERPASS for TARGETIP in $@; do echo "$USERPASS" | sshpass ssh-copy-id -f -i $KEYLOCATION "$USER"@"$TARGETIP" done
sumber
Ini adalah masalah dengan ssh-copy-id; itu juga menambahkan kunci setiap kali Anda menjalankannya. Jika Anda mengotomatiskan proses, file otor_keys Anda dengan cepat menjadi berantakan dengan kunci duplikat. Berikut adalah program Python yang menghindari kedua masalah tersebut. Ini berjalan dari server kontrol dan menempatkan kunci dari satu server jauh ke server jauh lain.
sumber
Daripada mengetikkan kata sandi Anda beberapa kali, Anda dapat menggunakan
pssh
dan-A
beralih untuk meminta kata sandi sekali, dan kemudian memasukkan kata sandi ke semua server dalam daftar.CATATAN: Menggunakan metode ini tidak memungkinkan Anda untuk menggunakan
ssh-copy-id
, jadi Anda harus menggulung metode Anda sendiri untuk menambahkan file kunci pub SSH Anda ke file akun jarak jauh Anda~/.ssh/authorized_keys
.Contoh
Berikut ini contoh yang berfungsi:
Skrip di atas umumnya terstruktur seperti:
pssh
Detail tingkat tinggicat <pubkey>
menghasilkan file kunci publikpssh
pssh
menggunakan-I
peralihan untuk menelan data melalui STDIN-l <remote user>
adalah akun server jarak jauh (kami mengasumsikan Anda memiliki nama pengguna yang sama di seluruh server dalam file IP)-A
memberitahupssh
untuk meminta kata sandi Anda dan kemudian menggunakannya kembali untuk semua server yang terhubung-i
memberitahupssh
untuk mengirim output ke STDOUT daripada menyimpannya dalam file (perilaku default-nya)'...cmds to add pubkey...'
- ini adalah bagian tersulit dari apa yang terjadi, jadi saya akan memecah ini dengan sendirinya (lihat di bawah)Perintah dijalankan di server jarak jauh
Ini adalah perintah yang
Dalam urutan:pssh
akan dijalankan di setiap server:atur umask pengguna jarak jauh ke 077, ini agar direktori atau file apa pun yang akan kita buat, akan memiliki izinnya diatur seperti:
buat direktori
~/.ssh
dan abaikan peringatan kami jika sudah ada di sana$afile
,, dengan path ke file Authorized_keyscat - >> $afile
- ambil input dari STDIN dan tambahkan ke file otor_keyssort -u $afile -o $afile
- secara unik mengurutkan file otor_keys dan menyimpannyaCATATAN: Bit terakhir itu adalah untuk menangani case di mana Anda menjalankan beberapa kali di atas terhadap server yang sama. Ini akan menghilangkan pubkey Anda dari ditambahkan beberapa kali.
Perhatikan kutu tunggal!
Juga berikan perhatian khusus pada fakta bahwa semua perintah ini bersarang di dalam tanda kutip tunggal. Itu penting, karena kami tidak ingin
$afile
dievaluasi sampai setelah dijalankan di server jauh.Saya telah memperluas di atas sehingga lebih mudah untuk membaca di sini, tetapi saya biasanya menjalankan semuanya pada satu baris seperti ini:
Materi bonus
Dengan menggunakan
pssh
Anda dapat melupakan harus membuat file dan menyediakan konten dinamis menggunakan-h <(...some command...)
atau Anda dapat membuat daftar IP menggunakanpssh
switch lain-H "ip1 ip2 ip3"
,.Sebagai contoh:
Di atas dapat digunakan untuk mengekstrak daftar IP dari
~/.ssh/config
file saya . Tentu saja Anda juga dapat menggunakanprintf
untuk menghasilkan konten dinamis:Sebagai contoh:
Anda juga dapat menggunakan
seq
untuk menghasilkan urutan angka yang diformat juga!Referensi & alat serupa untuk
pssh
Jika Anda tidak ingin menggunakan
pssh
seperti yang saya lakukan di atas, ada beberapa opsi lain yang tersedia.sumber
Ansible's authorized_key_module
sepertinya tidak berfungsi untuk mesin baru. Saya harus ssh-copy-id xxx terlebih dahulu, jadi saya mencari cara hanya menggunakan add ssh-key yang mungkin untuk mesin baru, ada ide?Salah satu alat SSH paralel (clusterssh, mssh, pssh) mungkin sesuai untuk Anda.
Sebagai contoh, gunakan cssh untuk masuk ke semua mesin dan menambahkan kunci sendiri.
sumber
Beberapa hal yang mungkin sesuai dengan tagihan:
Seperti disebutkan dalam jawaban lain, sshpass kemungkinan merupakan solusi termudah.
sumber
Saya ingin menekankan betapa buruknya ide itu untuk:
Berikut ini adalah implementasi yang sedikit lebih aman ...
sumber