tulis skrip shell ke ssh ke mesin jarak jauh dan jalankan perintah

97

Saya punya dua pertanyaan:

  1. Ada beberapa mesin linux jarak jauh, dan saya perlu menulis skrip shell yang akan menjalankan serangkaian perintah yang sama di setiap mesin. (Termasuk beberapa operasi sudo). Bagaimana ini bisa dilakukan dengan menggunakan skrip shell?
  2. Saat ssh'ing ke mesin jarak jauh, bagaimana menanganinya ketika meminta otentikasi sidik jari RSA.

Mesin jarak jauh adalah VM yang dibuat saat dijalankan dan saya hanya memiliki IP-nya. Jadi, saya tidak dapat menempatkan file skrip sebelumnya di mesin tersebut dan menjalankannya dari mesin saya.

Balanivash
sumber
Saya berpikir untuk menerapkan program seperti agen di mesin Linux jarak jauh, yang memelihara koneksi dengan server melalui koneksi soket jaringan (atau SSL) / dengan polling berkala ke server.
Raptor
Saya hanya perlu menjalankan serangkaian perintah sekali, jadi tidak perlu memelihara koneksi
Balanivash
"tidak ada skrip" berarti "tidak ada file sama sekali", bukan? Bagaimana Anda menangani otentikasi? Anda dapat menonaktifkan pemeriksaan sidik jari host (lihat jawaban saya), tetapi Anda masih mendapatkan prompt kata sandi interaktif jika Anda belum menyiapkan kunci publik / pribadi.
Andreas Fester
1
Andreas: iya. tidak ada file sama sekali. prompt passwd dapat ditangani menggunakan expectsebagai ` ekspektasi " ? assword: "`
Balanivash

Jawaban:

142

Ada beberapa mesin linux jarak jauh, dan saya perlu menulis skrip shell yang akan menjalankan serangkaian perintah yang sama di setiap mesin. (Termasuk beberapa operasi sudo). Bagaimana ini bisa dilakukan dengan menggunakan skrip shell?

Anda dapat melakukan ini dengan ssh, misalnya:

#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

Saat ssh'ing ke mesin jarak jauh, bagaimana menanganinya ketika meminta otentikasi sidik jari RSA.

Anda dapat menambahkan StrictHostKeyChecking=noopsi ke ssh:

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

Ini akan menonaktifkan pemeriksaan kunci host dan secara otomatis menambahkan kunci host ke daftar host yang dikenal. Jika Anda tidak ingin host ditambahkan ke file host yang dikenal, tambahkan opsi -o UserKnownHostsFile=/dev/null.

Perhatikan bahwa ini menonaktifkan pemeriksaan keamanan tertentu , misalnya perlindungan terhadap serangan man-in-the-middle. Oleh karena itu, sebaiknya tidak diterapkan di lingkungan yang sensitif terhadap keamanan.

Andreas Fester
sumber
Apa bahasa skripnya? Anda tentu saja juga dapat memanggil sshdari skrip shell apa pun
Andreas Fester
bagaimana jika Anda juga ingin melakukan CTRL + C dan melanjutkan ssh ke beberapa server ?. misalnya di beberapa server meminta kata sandi dan di beberapa lainnya tidak, jadi skrip akan macet di sana. apakah ada cara melakukan sesuatu yang mirip dengan -o untuk melakukan CTRL c atau CTRL d?
Chanafot
5

Ada beberapa cara untuk mengatasinya.

Cara favorit saya adalah menginstal http://pamsshagentauth.sourceforge.net/ pada sistem jarak jauh dan juga kunci publik Anda sendiri. (Cari tahu cara untuk menginstal ini di VM, entah bagaimana Anda memasang seluruh sistem Unix, apa lagi beberapa file?)

Dengan agen ssh Anda diteruskan, Anda sekarang dapat masuk ke setiap sistem tanpa kata sandi.

Dan lebih baik lagi, modul pam itu akan mengautentikasi sudo dengan pasangan kunci ssh Anda sehingga Anda dapat menjalankan dengan hak root (atau pengguna lain) sesuai kebutuhan.

Anda tidak perlu khawatir tentang interaksi kunci host. Jika inputnya bukan terminal maka ssh hanya akan membatasi kemampuan Anda untuk meneruskan agen dan mengautentikasi dengan kata sandi.

Anda juga harus melihat paket seperti Capistrano. Pasti melihat-lihat situs itu; itu memiliki pengantar untuk skrip jarak jauh.

Baris skrip individu mungkin terlihat seperti ini:

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply
DigitalRoss
sumber
4

Instal sshpass menggunakan, apt-get install sshpasskemudian edit skrip dan masukkan IP mesin linux Anda, nama pengguna dan kata sandi dalam urutan masing-masing. Setelah itu jalankan skrip itu. Itu dia ! Skrip ini akan menginstal VLC di semua sistem.

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done
Arjun G Perambra
sumber
gunakan $ SSHPASS untuk mengekspor kata sandi agar tidak muncul di skrip. Ref: tecmint.com/…
Hexy
2

Jika Anda dapat menulis kode Perl, maka Anda harus mempertimbangkan untuk menggunakan Net :: OpenSSH :: Parallel .

Anda akan dapat menjelaskan tindakan yang harus dijalankan di setiap host secara deklaratif dan modul akan menangani semua detail yang menakutkan. Menjalankan perintah melalui sudojuga didukung.

salva
sumber
2

Ini bekerja untuk saya.

Sintaks: ssh -i pemfile.pem nama_pengguna @ ip_address 'command_1; perintah 2; perintah 3 '

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service'
Viraj Wadate
sumber
1

Untuk jenis tugas ini, saya berulang kali menggunakan Ansible yang memungkinkan untuk menduplikasi skrip bash secara koheren di beberapa penampung atau VM. Ansible (lebih tepatnya Red Hat ) sekarang memiliki antarmuka web tambahan AWX yang merupakan edisi open-source dari Menara komersial mereka.

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: produk komersial, Anda mungkin akan menjelajahi AWX open-source gratis, daripada free-trail 15 hari Menara

Fibo
sumber
1

Ada banyak cara untuk menjalankan perintah atau skrip di beberapa mesin Linux jarak jauh. Salah satu cara sederhana & termudah adalah melalui pssh (program ssh paralel)

pssh : adalah program untuk mengeksekusi ssh secara paralel pada sejumlah host. Ini menyediakan fitur seperti mengirim input ke semua proses, melewatkan kata sandi ke ssh, menyimpan output ke file, dan waktu habis.

Contoh & Penggunaan:

Hubungkan ke host1 dan host2, dan cetak "hello, world" dari masing-masing:

 pssh -i -H "host1 host2" echo "hello, world"

Jalankan perintah melalui skrip di beberapa server:

pssh -h hosts.txt -P -I<./commands.sh

Gunakan & jalankan perintah tanpa memeriksa atau menyimpan kunci host:

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

Jika file hosts.txt memiliki banyak entri, katakanlah 100, maka opsi paralelisme juga dapat disetel ke 100 untuk memastikan bahwa perintah dijalankan secara bersamaan:

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

Opsi :
-I: Membaca masukan dan mengirim ke setiap proses ssh.
-P: Memberi tahu pssh untuk menampilkan keluaran saat ia diterima.
-h: Membaca file host.
-H: [pengguna @] host [: port] untuk host tunggal.
-i: Menampilkan keluaran standar dan kesalahan standar saat setiap host menyelesaikan
-x args: Meneruskan argumen baris perintah SSH tambahan
-o opsi: Dapat digunakan untuk memberikan opsi dalam format yang digunakan dalam file konfigurasi. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p paralelisme: Gunakan nomor yang diberikan sebagai jumlah maksimum dari koneksi bersamaan
-q Mode diam: Menyebabkan sebagian besar pesan peringatan dan diagnostik disembunyikan.
-t: Buat waktu koneksi habis setelah jumlah detik yang ditentukan. 0 berarti pssh tidak akan melakukan timeout koneksi apapun

Saat ssh'ing ke mesin jarak jauh, bagaimana menanganinya ketika meminta otentikasi sidik jari RSA.

Nonaktifkan StrictHostKeyChecking untuk menangani permintaan otentikasi RSA.
-o StrictHostKeyChecking = tidak

Sumber : man pssh

Skanda Shastry
sumber
0

Ini berhasil untuk saya. Saya membuat fungsi. Taruh ini di skrip shell Anda:

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

Jika Anda memiliki beberapa mesin yang ingin Anda lakukan perintah yang sama, ulangi baris tersebut dengan titik koma. Misalnya, jika Anda memiliki dua mesin, Anda akan melakukan ini:

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

Gantikan USER dengan pengguna komputer tersebut. Gantikan HOST dengan nama komputer. Ganti COMMAND dengan perintah yang ingin Anda lakukan di komputer.

Semoga ini membantu!

Kontributor Anonim
sumber
-1

Anda dapat mengikuti pendekatan ini:

  • Hubungkan ke mesin jarak jauh menggunakan Expect Script . Jika mesin Anda tidak mendukung, harap Anda dapat mengunduh yang sama. Menulis skrip Expect sangat mudah (google mendapatkan bantuannya)
  • Letakkan semua tindakan yang perlu dilakukan di server jarak jauh dalam skrip shell.
  • Panggil skrip shell jarak jauh dari skrip ekspektasi setelah login berhasil.
rai.skumar
sumber
Seperti yang telah saya sebutkan dalam pertanyaan, mesin jarak jauh dibuat saat dijalankan dan saya tidak dapat memiliki skrip di mesin sebelumnya.
Balanivash
Dalam hal ini, letakkan semua tindakan dalam skrip Expect. Berharap skrip dapat menjalankan perintah juga pada host jarak jauh.
rai.skumar