Saya memiliki mesin lokal yang seharusnya membuat sesi SSH ke master
mesin jarak jauh dan kemudian sesi SSH dalam lainnya dari master
ke masing-masing beberapa remote slaves
, dan kemudian menjalankan 2 perintah yaitu untuk menghapus direktori tertentu dan membuatnya kembali.
Perhatikan bahwa mesin lokal memiliki SSH tanpa kata sandi untuk master dan master memiliki SSH tanpa kata sandi untuk slave. Juga semua nama host dikenal di .ssh/config
mesin lokal / master dan nama host para budak ada di slaves.txt
lokal dan saya membacanya dari sana.
Jadi yang saya lakukan dan kerjakan adalah ini:
username="ubuntu"
masterHostname="myMaster"
while read line
do
#Remove previous folders and create new ones.
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition""
ssh -n $username@$masterHostname "ssh -t -t $username@$line "mkdir -p EC2_WORKSPACE/$project Input Output Partition""
#Update changed files...
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rsync --delete -avzh /EC2_NFS/$project/* EC2_WORKSPACE/$project""
done < slaves.txt
Cluster ini ada di Amazon EC2 dan saya perhatikan ada 6 sesi SSH yang dibuat pada setiap iterasi yang menyebabkan penundaan yang signifikan. Saya ingin menggabungkan 3 perintah ini menjadi 1 untuk mendapatkan koneksi SSH yang lebih sedikit. Jadi saya mencoba menggabungkan 2 perintah pertama menjadi
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input Output Partition""
Tapi itu tidak berfungsi seperti yang diharapkan. Tampaknya mengeksekusi yang pertama ( rm -rf Input Output Partition
) dan kemudian keluar dari sesi dan berlanjut. Apa yang dapat saya?
sumber
-J
opsi yang akan menentukan host melompat Anda.Jawaban:
Anggap itu
&&
operator yang logis. Itu tidak berarti "juga jalankan perintah ini" itu berarti "jalankan perintah ini jika yang lain berhasil".Itu berarti jika
rm
perintah gagal (yang akan terjadi jika salah satu dari tiga direktori tidak ada) makamkdir
tidak akan dieksekusi. Ini tidak terdengar seperti perilaku yang Anda inginkan; jika direktori tidak ada, mungkin baik untuk membuatnya.Menggunakan
;
Titik koma
;
digunakan untuk memisahkan perintah. Perintah dijalankan secara berurutan, menunggu masing-masing sebelum melanjutkan ke yang berikutnya, tetapi keberhasilan atau kegagalan mereka tidak berdampak satu sama lain.Melarikan diri dari kutipan batin
Kutipan di dalam kutipan lain harus diloloskan, jika tidak, Anda membuat titik akhir dan titik awal tambahan. Perintah Anda:
Menjadi:
Perintah Anda saat ini, karena kurangnya kutipan yang lolos harus dijalankan:
jika itu berhasil:
Anda akan melihat highlight sintaks menunjukkan seluruh perintah sebagai merah di sini, yang berarti seluruh perintah adalah string yang diteruskan ke ssh. Periksa mesin lokal Anda; Anda mungkin memiliki direktori
Input
Output
dan diPartition
mana Anda menjalankan ini.sumber
&
penyebab perintah untuk menjalankan int latar belakang dia, yang berarti mereka wont menunggu sampai akhir sebelum bergerak ke depan.Anda selalu dapat mendefinisikan dalam Multiplexing kotak lompatan Anda di OpenSSH
Untuk itu lakukan di
/etc/ssh/ssh_config
:Dengan cara ini, setiap koneksi berurutan yang dibuat ke server yang sama dalam 30 menit berikutnya akan dilakukan menggunakan kembali koneksi ssh sebelumnya.
Anda juga dapat mendefinisikannya untuk mesin atau sekelompok mesin. Diambil dari tautan yang disediakan.
sumber
/tmp/
.man ssh
,ControlPath
,ControlMaster
danControlPersist
pilihan yang valid untuk lulusssh
perintah dengan menggunakan-o
. Bisa menjadi kasus penggunaan yang lebih tepat, mengatur multiplexing dissh
skrip pertama dan mendaur ulangnya untuk yang lain, tetapi sebaliknya hindari penalti performa. Saya bertanya-tanya apa tolok ukur multiplexing VS bukan untuk 3 koneksi SSH, mengingat bahwa "Ada juga penundaan yang signifikan ketika membuka koneksi baru"Anda dapat menempatkan semua perintah Anda ke skrip terpisah di server "master" Anda.
Master Script
Kemudian dalam skrip ssh Anda, panggil seperti ini: SSH Script
ATAU jika semua file harus pada mesin awal Anda bisa melakukan sesuatu seperti ini:
script1
script2
skrip ssh
sumber
Beberapa waktu yang lalu, saya memiliki kesempatan untuk menggunakan soket kontrol seperti rekomendasi jawaban lain (jawaban ini pada dasarnya adalah kombinasi dari menggunakan soket kontrol seperti jawaban ini dan skrip seperti jawaban ini ).
Kasus penggunaan adalah hack: Pengguna
authorized_keys
target ditimpa secara berkala oleh tugas yang dijadwalkan dan saya ingin dengan cepat menguji sesuatu tanpa melalui birokrasi yang diperlukan untuk menambahkan sesuatu ke file itu. Jadi saya akan menyiapkan loop sementara yang menambahkan kunci ke file itu sesuai kebutuhan, menjalankan tes saya, dan membatalkan loop. Namun, akan ada jendela kecil di mana tugas yang dijadwalkan akan menimpa file dan loop saya akan tetapsleep
. Jadi, menyiapkan soket kontrol di awal akan membiarkan skrip SSH saya nanti tanpa masalah:Dimana
setup-ssh.sh
:Dan
.ssh-config
:Dan
run-test.sh
:Urutannya seperti ini:
setup-ssh.sh
.setup-ssh.sh
sibuk-loop server sampai semuanya memiliki pengaturan soket kontrol. Thehosts
File hanya berisi daftar salah satu nama host server yang per baris.${CONFIG_DIR}/scripts/.ssh-config
, kecuali saya menentukan file yang digunakan-F
, koneksi SSH tidak akan menggunakannya. Jadi ini memungkinkan saya untuk menggunakan soket kontrol hanya di mana saya membutuhkannya menggunakanF
opsi.xargs
untuk mendistribusikan beban kerja melalui server, dengan memulai pekerjaan baru segera setelah menjalankan yang berakhir.sumber