Bagaimana cara menulis skrip bash, yang masuk ke mesin lain untuk melakukan hal-hal?


11

Apakah mungkin untuk menulis skrip bash, itu

  1. akan dimulai dari mesin A, masuk pada mesin B berbeda dengan ssh (kedua mesin A dan B akan menjadi Linux-Machines),
  2. menyalin beberapa file ke mesin B
  3. menjalankan skrip python skrip python yang diberikan pada mesin ini.
  4. mentransfer hasilnya kembali ke mesin A
  5. log off dari mesin B.

Apakah ini bisa dilakukan secara teknis?

Jawaban:


15

Tentu saja bisa dilakukan:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

dan hanya itu ...

Tetapi ada satu masalah: Anda akan diminta kata sandi tiga kali. Untuk menghindari itu, Anda dapat membuat kunci ssh dan mengotorisasi pengguna dengan kunci ini.

Untuk membuat kunci ssh dijalankan ssh-keygen -t rsa, jawab pertanyaan dan salin kunci publik ke host jarak jauh (mesin B) ke ~/.ssh/authorized_keysfile. Kunci pribadi harus disimpan di ~/.ssh/id_rsadalam mesin lokal (A).


Jika kunci publik bukan opsi, Anda dapat melakukan sesuatu yang kasar untuk meminimalkan prompt kata sandi seperticat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick

Jika Anda ingin menggunakan kata sandi, Anda selalu dapat menggunakan kumpulan koneksi OpenSSH dengan mendefinisikan ControlMaster=yesdan ControlPath=/path/to/socketfile, dan kemudian memulai satu koneksi ssh dengan -fmenjalankan ssh latar belakang. Beri tahu semua koneksi SSH berikutnya untuk menggunakan file soket yang sama.
jsbillings

4

Saya dapat melakukan semuanya dalam satu sshkoneksi / sesi:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

Ini:

  1. Salinan local_srcke remote_dst,
  2. Laksanakan command,
  3. Salinan remote_srcke local_dst.

Tetapi jika commandmenulis stdout, hasilnya juga masuk local_dst. Jika commandmembaca input dari stdin, ia akan menerima dan EOF.


3

Meskipun Anda dapat melakukan ini di dalam satu sesi ssh, agak sulit untuk menggabungkan menyalin file dengan menjalankan perintah.

Cara termudah untuk mengatasi tugas ini adalah menjalankan sesi SSH terpisah untuk tiga operasi:

rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Ini membutuhkan otentikasi ke mesinB tiga kali. Cara yang disarankan untuk menghindari otentikasi berkali-kali adalah dengan menggunakan fasilitas berbagi koneksi dalam versi modern OpenSSH: mulai koneksi master ke B sekali dan untuk semua, dan biarkan SSH secara otomatis membonceng ke koneksi master. Tambahkan ControlMaster autodan ControlPathgaris ke Anda~/.ssh/config , kemudian mulai koneksi master di latar belakang, kemudian lakukan tugas Anda.

ssh -fN machineB                         # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Daripada menggunakan scp atau rsync untuk menyalin file, mungkin lebih mudah untuk memasang sistem file jarak jauh di bawah SSHFS . Ngomong-ngomong, ini akan mengatur koneksi master (dengan anggapan Anda telah mengatur koneksi ~/.ssh/configseperti yang ditunjukkan di atas).

mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .
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.