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.
Jawaban:
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.
sumber
tail -F
, yang akan mendeteksi bahwa file telah diganti, jadi ketika menjadi raksasa Anda dapat menghapusnya dan memulai kembali dengan file baru.mkfifo /tmp/commands
harus menjadi solusi yang lebih baikPersistensi Otomatis Menggunakan OpenSSH
Anda juga dapat menggunakan
ControlMaster
fitur 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
-M
sebagai saklar baris perintah atau mengaktifkanControlMaster
opsi di Anda~/.ssh/ssh_config
, misalnya:Selain itu, Anda harus mengatur
ControlPath
penggunaan baris berikut di~/.ssh/ssh_config
: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:
Cheerio, nesono
sumber
ssh -N
memulai sesi tanpa perintah jarak jauh, sepertinya tidak ada opsi yang sesuai di ssh_config.Di
/etc/ssh/ssh_config
tambahkansumber
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:
Untuk mengirimkan pekerjaan Anda ke antrian:
Anda tentu saja dapat menggunakan -S untuk mendistribusikan pekerjaan ke komputer jarak jauh:
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:
sumber
ya itu mungkin dengan pipa:
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
sumber
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
sumber
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:
Dan kemudian untuk mengirim perintah, tuliskan ke FD 4.
Jika Anda melakukannya dengan cara ini, Anda tidak dapat mengakses hasil dari perintah dengan mudah, tetapi berdasarkan pertanyaan Anda sepertinya tidak perlu.
sumber