Saya mencoba membuat kode skrip shell yang menggunakan koneksi ssh untuk melakukan "detak jantung". Saya ingin mengakhiri sisi klien dan server dari koneksi tersebut setelah batas waktu tertentu (setelah koneksi terputus).
Apa yang saya temukan sejauh ini:
- TCPKeepAlive ya/tidak untuk ssh dan sshd
- ClientAliveCountMax untuk sshd
- ClientAliveInterval untuk sshd
- ServerAliveCountMax untuk ssh
- ServerAliveInterval untuk ssh
Untuk mengubah “ClientAliveCountMax” saya harus memodifikasi sshd_config pada setiap mesin target (opsi ini dinonaktifkan secara default).
Jadi pertanyaan saya adalah – dapatkah saya menggunakan “TCPKeepAlive” untuk tujuan saya juga (tanpa mengubah apa pun pada mesin sumber/target)?
Sistem operasi target adalah SLES11 SP2 – tetapi menurut saya itu tidak relevan di sini.
Jawaban yang Diterima:
Anda mungkin ingin menggunakan pengaturan ServerAlive untuk ini. Mereka tidak memerlukan konfigurasi apa pun di server, dan dapat diatur pada baris perintah jika Anda mau.
ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST
Ini akan mengirim pesan ssh keepalive setiap 5 detik, dan jika tiba saatnya untuk mengirim keepalive lain, tetapi tanggapan untuk yang terakhir tidak diterima, maka koneksi akan dihentikan.
Perbedaan penting antara ServerAliveInterval
dan TCPKeepAlive
adalah lapisan tempat mereka beroperasi.
TCPKeepAlive
beroperasi pada lapisan TCP. Ini mengirimkan paket TCP ACK kosong. Firewall dapat dikonfigurasi untuk mengabaikan paket-paket ini, jadi jika Anda melewati firewall yang menghentikan koneksi yang tidak aktif, ini mungkin tidak membuat koneksi tetap hidup.ServerAliveInterval
beroperasi pada lapisan ssh. Ini benar-benar akan mengirim data melalui ssh, sehingga paket TCP memiliki data terenkripsi dan firewall tidak dapat mengetahui apakah itu paket keepalive, atau paket yang sah, jadi ini berfungsi lebih baik.