Saya menjalankan skrip yang terhubung melalui SSH tanpa kata sandi pada host jarak jauh. Saya ingin mengatur batas waktu, sehingga jika host jarak jauh mengambil waktu tak terbatas untuk dijalankan, saya ingin keluar dari sesi ssh dan melanjutkan baris lain dalam skrip sh saya.
Adakah yang tahu bagaimana melakukannya?
ssh
sesi Anda " (pertanyaan "Bagaimana cara meningkatkan batas waktu Koneksi SSH?"), Ini adalah tempat yang salah . Jawabannya ada di tautan ini tentang ssh-timeout .Jawaban:
Di mana 10 adalah waktu dalam detik. Batas waktu ini hanya berlaku untuk pembuatan koneksi.
sumber
Gunakan
-o ConnectTimeout
dan-o BatchMode=yes -o StrictHostKeyChecking=no
.ConnectTimeout menjaga agar skrip tidak menggantung, BatchMode membuatnya tidak menggantung dengan Host tidak dikenal, YES untuk menambahkan ke known_hosts, dan StrictHostKeyChecking menambahkan sidik jari secara otomatis.
**** CATATAN **** "StrictHostKeyChecking" hanya ditujukan untuk jaringan internal tempat Anda mempercayai host Anda. Bergantung pada versi klien SSH, "Anda yakin ingin menambahkan sidik jari" dapat menyebabkan klien menggantung tanpa batas waktu (terutama versi lama yang berjalan pada AIX). Sebagian besar versi modern tidak menderita masalah ini. Jika Anda harus berurusan dengan sidik jari dengan beberapa host, saya sarankan untuk menjaga file known_hosts dengan semacam alat manajemen konfigurasi seperti boneka / boneka / koki / garam / dll.
sumber
-o StrictHostKeyChecking=no
tidak menjawab pertanyaan, tetapi itu ide yang buruk jika Anda peduli dengan keamanan, yang mungkin menjadi alasan Anda menggunakan SSH.StrictHostKeyChecking=no
jika Anda peduli dengan keamanan sama sekali. @Doug: skrip tidak akan hang - itu hanya akan bersikeras bahwa Anda ssh ke host jarak jauh secara manual pertama kali, sehingga mengenal host. Tapi itu akan melindungi Anda dari serangan MITM. Harap edit jawaban ini untuk mencerminkannya karena ini saran yang sangat berbahaya. Dan itu bahkan tidak diminta.coba ini:
timeout mengeksekusi perintah ssh (dengan args) dan mengirimkan SIGTERM jika ssh tidak kembali setelah 5 detik. untuk detail lebih lanjut tentang batas waktu, baca dokumen ini : http://man7.org/linux/man-pages/man1/timeout.1.html
atau Anda dapat menggunakan param ssh:
sumber
brew install coreutils
dan kemudian gunakangtimeout
(sumber: stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x ).timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg'
Ini membunuh proses di sisi klien SSH, tetapi / tmp / blarg masih akan dimodifikasi pada server jauh. Ini berarti bahwa jika Anda menjalankan pekerjaan intensif CPU pada server jarak jauh, Anda akan membocorkan proses.Anda juga dapat terhubung dengan bendera
jadi klien SSH akan mengirim paket nol ke server setiap<secs>
detik, hanya untuk menjaga koneksi tetap hidup. Di Linux ini juga dapat diatur secara global/etc/ssh/ssh_config
atau per pengguna di~/.ssh/config
.sumber
Jika semuanya gagal (termasuk tidak memiliki
timeout
perintah) konsep dalam skrip shell ini akan berfungsi:sumber
Nah, Anda bisa menggunakan nohup untuk menjalankan apa pun yang Anda jalankan pada 'mode non-blocking'. Jadi, Anda bisa terus memeriksa apakah apa pun yang seharusnya dijalankan, dijalankan, atau keluar.
Jadi yang kedua Anda hanya memeriksa apakah file tersebut ada.
sumber