Bagaimana saya bisa membuat koneksi SSH persisten ke perintah "stream" selama periode waktu tertentu?

9

Katakanlah saya memiliki aplikasi yang berjalan pada satu PC yang mengirimkan perintah melalui SSH ke PC lain di jaringan (kedua mesin yang menjalankan Linux).

Misalnya setiap kali terjadi sesuatu di # 1, saya ingin menjalankan tugas di # 2. Dalam pengaturan ini, saya harus membuat koneksi SSH pada setiap perintah.

Apakah ada cara sederhana untuk melakukan ini dengan alat unix dasar tanpa memprogram aplikasi klien / server khusus? Pada dasarnya yang saya inginkan adalah membuat koneksi melalui SSH dan kemudian mengirim satu perintah demi satu.

Jakub Arnold
sumber

Jawaban:

12

Tidak yakin apakah itu dapat digunakan dalam produksi tetapi Anda dapat melakukan sesuatu seperti ini:

buat file di # 1

1> touch /tmp/commands

Kemudian jalankan perintah:

1> tail -f /tmp/commands | ssh [email protected]

Itu akan membuka file / tmp / perintah dan mulai mengirim kontennya ke server xxxx (# 2) dan menjalankannya di sana baris demi baris

sekarang, setiap kali sesuatu terjadi pada # 1 lakukan:

1> echo "ls -l" >> /tmp/commands

atau

1> echo "reboot" >> /tmp/commands

apa pun yang Anda tambahkan ke file / tmp / perintah akan dikirim ke # 2 dan dieksekusi. Pastikan Anda tidak menjalankan sesuatu yang interaktif, atau berurusan dengannya.

Vitaly Nikolaev
sumber
Inilah yang saya cari, solusi yang sangat kreatif :)
Jakub Arnold
5
Saya akan menambahkan bahwa Anda harus menggunakan tail -F, yang akan mendeteksi bahwa file telah diganti, jadi ketika menjadi raksasa Anda dapat menghapusnya dan memulai kembali dengan file baru.
DerfK
3
@ DerfK, sebagai alternatif, mkfifo /tmp/commandsharus menjadi solusi yang lebih baik
solotim
18

Persistensi Otomatis Menggunakan OpenSSH

Anda juga dapat menggunakan ControlMasterfitur OpenSSH, yang membuka soket domain unix untuk koneksi pertama dan menggunakan kembali koneksi ini di semua panggilan berikutnya.

Untuk mengaktifkan fitur ini, Anda dapat menggunakan -Msebagai saklar baris perintah atau mengaktifkan ControlMasteropsi di Anda ~/.ssh/ssh_config, misalnya:

ControlMaster auto

Selain itu, Anda harus mengatur ControlPathpenggunaan baris berikut di ~/.ssh/ssh_config:

Host *
   ControlPath ~/.ssh/master-%r@%h:%p

Untuk mempertahankan koneksi persisten ke host, mis. Jika Anda ingin menjalankan skrip yang perlu membuat banyak koneksi ssh ke host, tidak ada yang persisten selama seumur hidup skrip, Anda dapat memulai koneksi diam terlebih dahulu menggunakan:

ssh -MNf remotehost

Cheerio, nesono

nesono
sumber
Saya masuk ke kesalahan server hanya untuk memberi +1 suara jawaban Anda. Milikmu bekerja!
Karma
ssh -Nmemulai sesi tanpa perintah jarak jauh, sepertinya tidak ada opsi yang sesuai di ssh_config.
Jokester
2

Di /etc/ssh/ssh_configtambahkan

# Send keep alive signal to remote sshd
ServerAliveInterval 60
Sandra
sumber
2

Jika Anda sering mengalami hal semacam ini, coba Paralel . Itu seperti dsh (shell terdistribusi) tetapi memiliki beberapa fitur yang rapi seperti menghitung semaphores dan secara aktif dipertahankan.

Dari dokumentasi:

CONTOH: GNU Paralel sebagai sistem antrian / manajer batch

GNU Parallel dapat berfungsi sebagai sistem antrian pekerjaan sederhana atau manajer batch. Idenya adalah untuk menempatkan pekerjaan ke dalam file dan membuat GNU Parallel membaca dari itu terus menerus. Karena GNU Parallel akan berhenti di akhir file, kami menggunakan tail untuk melanjutkan membaca:

echo >jobqueue; tail -f jobqueue | parallel

Untuk mengirimkan pekerjaan Anda ke antrian:

echo my_command my_arg >> jobqueue

Anda tentu saja dapat menggunakan -S untuk mendistribusikan pekerjaan ke komputer jarak jauh:

echo >jobqueue; tail -f jobqueue | parallel -S ..

Ada banyak contoh bagus yang baru saja menggores permukaan. Ini yang keren.

CONTOH: Mendistribusikan pekerjaan ke komputer lokal dan jarak jauh

Konversikan * .mp3 ke * .ogg menjalankan satu proses per inti CPU di komputer lokal dan server2:

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3
Allen
sumber
0

ya itu mungkin dengan pipa:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

ini akan menjalankan perintah echo "hi" pada host2

Anda hanya perlu menulis sebuah program, yang hanya memberikan perintah (jangan lupa;) dan kemudian pipa yang output ke ssh

JMW
sumber
0

Anda mungkin ingin menggunakan program seperti dsh (Distributed SHell) yang dibuat untuk melakukan hal itu :), Setelah mengonfigurasinya dengan nama host dan mengatur publickeya auth, Anda dapat menggunakannya untuk menjalankan perintah pada beberapa mesin baik secara seri ("jalankan pada mesin kemudian jalankan pada mesin b ") atau dalam pararell (" jalankan pada semua mesin pada waktu yang sama "). Atau hanya membuat skrip

#!/bin/sh
ssh machine -- $@
exec $@
XANi
sumber
0

PENOLAKAN: Saya tidak bisa menguji ini sekarang, karena saya menggunakan mesin windows dengan bash tetapi tanpa ssh.

Dalam skrip bash, Anda dapat melakukan sesuatu seperti ini:

exec 4> >(ssh --ssh-options-here user@host)

Dan kemudian untuk mengirim perintah, tuliskan ke FD 4.

echo 'echo hi' >&4

Jika Anda melakukannya dengan cara ini, Anda tidak dapat mengakses hasil dari perintah dengan mudah, tetapi berdasarkan pertanyaan Anda sepertinya tidak perlu.

pengguna253751
sumber