Jaga agar sesi SSH tetap hidup [tertutup]

242

Saya gunakan ssh -p8520 username@remote_hostuntuk masuk ke server jauh.

Masalah :

Itu selalu terhubung dan berfungsi dengan baik ketika saya di tempat kerja. Sayangnya, terminal membeku dalam 10 - 15 menit setelah saya terhubung dengan server jauh dari rumah.

Tidak ada laporan kesalahan / batas waktu pada konsol tetapi kursor tidak dapat bergerak lagi.

Ketika masuk wuntuk memeriksa pengguna login, beberapa pengguna login zombie ada di sana, dan saya harus membunuh mereka secara manual.

Ini sangat menjengkelkan. Ada yang bisa bantu saya?

Haifeng Zhang
sumber
Saya sudah memiliki ini juga, saya mulai menggunakannya screen. Mungkin ini semacam masalah batas waktu.
martin
@martin screenmembantu menjaga program tetap berjalan. Sayangnya kadang-kadang saya harus bekerja di server jarak jauh :(
Haifeng Zhang
Jika Anda memulainya tanpa parameter, ini memberi Anda shell.
martin
Apakah Anda screenhanya mengatakan ? Itu bisa menyelesaikan masalah koneksi yang hilang? Tidak ada screen -S screenName? Saya selalu menggunakan layar dengan -Sdan-r
Haifeng Zhang
1
Tidak, ini tidak menyelesaikan masalah, Anda hanya menghindari kehilangan pekerjaan Anda di terminal. Jika Anda tidak melakukan apa-apa, itu masih akan membeku, Anda hanya dapat mengambil di mana Anda mulai. Maksud saya, Anda dapat membuat terminal yang selalu dapat dilanjutkan dengan menggunakan screen. Anda sepertinya sudah tahu itu;)
martin

Jawaban:

451

Daemon ssh (sshd), yang menjalankan sisi-server, menutup koneksi dari sisi-server jika klien diam (yaitu, tidak mengirim informasi). Untuk mencegah kehilangan koneksi, instruksikan klien ssh untuk mengirim sinyal sign-of-life ke server sesekali.

Konfigurasi untuk ini ada di file $HOME/.ssh/config, buat file jika tidak ada (file konfigurasi tidak boleh dibaca dunia, jadi jalankan chmod 600 ~/.ssh/configsetelah membuat file). Untuk mengirim sinyal setiap mis. Empat menit (240 detik) ke host jarak jauh, masukkan yang berikut dalam file konfigurasi:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Untuk mengaktifkan pengiriman sinyal tetap hidup untuk semua host, tempatkan konten berikut dalam file konfigurasi:

Host *
    ServerAliveInterval 240
rockymonkey555
sumber
24
@ user271996, mengapa kita harus memulai ulang daemon untuk pengaturan sisi klien?
maxschlepzig
Konfigurasi hanya harus bisa ditulis oleh pengguna. keterbacaan bukan masalah. Menggunakan 600 sebagai tingkat izin Anda baik-baik saja karena itu hanya dapat ditulis oleh pengguna.
jbruni
1
kalau-kalau tidak jelas file konfigurasi ini ada di PC / linux box Anda
zzapper
5
Saya selalu bingung tentang nama konfigurasi: klien menggunakan ServerAliveInterval saat server menggunakan ClientAliveInterval . Berantakan sekali.
youkaichao
@youkaichao Sering ada kebingungan ini. Sebagai seorang perancang API, ada beberapa alasan yang mungkin saya kemukakan dalam dua hal. Pada akhirnya, yang paling penting adalah dokumentasi yang baik dari standar yang dipilih.
Cameron Tacklind
171

Saya menginginkan solusi satu kali:

ssh -o ServerAliveInterval=60 [email protected]

Menyimpannya dalam alias:

alias sshprod='ssh -v -o ServerAliveInterval=60 [email protected]'

Sekarang dapat terhubung seperti ini:

me@MyMachine:~$ sshprod
Ryan
sumber
12
Itu keren, tapi bukan "solusi satu kali". Jika Anda akan terhubung ke server lebih dari sekali, mengapa tidak melakukan Host *& ServerAliveInterval 240(atau menentukan nama host, jika Anda hanya menginginkannya [email protected]seperti pada jawaban rockymonkey555? Mengatur alias tidak tampak lebih mudah dengan cara apa pun.
Lambart
8
Atau, cukup buat alias di ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Jabba
15
Dia berarti "satu kali" seperti dalam "itu hanya bekerja satu kali", bukan "Saya hanya perlu menulisnya satu kali".
Jonathan Hartley
1
Ya, jika Anda membaca "satu kali" sebagai "sekali pakai", ini berfungsi dengan baik.
philraj
Jika Anda ingin "satu-kapal" yang set ServerAliveIntervaluntuk 60, besar. Namun menggunakan alias bash saat Anda bisa menggunakan.ssh/config itu konyol.
Cameron Tacklind
50

Bagi yang penasaran, @ edward-coast

Jika Anda ingin mengatur agar server tetap hidup , tambahkan ini ke /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : Menetapkan interval waktu habis dalam hitungan detik setelah yang jika tidak ada data telah diterima dari klien, sshd (8) akan mengirim pesan melalui saluran terenkripsi untuk meminta tanggapan dari klien.

ClientAliveCountMax : Menetapkan jumlah pesan hidup klien (lihat di bawah) yang dapat dikirim tanpa sshd (8) menerima pesan apa pun dari klien. Jika ambang ini tercapai saat pesan klien yang dikirim, sshd akan memutuskan klien, mengakhiri sesi.

Jeff Davenport
sumber
Tampaknya tidak ada "parameter" seperti ClientAliveInterval, hanya ServerAliveInterval, Anda dapat memeriksa di halaman manual "man ssh_config"
dtj
6
Itu salah, lihat "man sshd_config" untuk porsi server yang menjalankan daemon ssh, bukan konfigurasi klien.
Jeff Davenport
Haruskah saya gunakan ClientAliveIntervaluntuk membiarkan server memeriksa klien hidup, atau haruskah saya membiarkan klien "ping" server dengan ServerAliveIntervalberulang kali? Keduanya sepertinya tidak masuk akal
qrtLs
1
Hanya atur ClientAliveIntervalpada server jika Anda ingin server untuk memutuskan koneksi mati yang tidak merespons, dan Anda dapat menyesuaikan seberapa sering dan kapan itu terjadi.
Jeff Davenport
20

pengaturan dempul

Pengguna Putty FYI dapat mengatur opsi di sini

Ruben Benjamin
sumber
10

Kita dapat menjaga koneksi ssh tetap hidup dengan mengikuti konfigurasi Global

Tambahkan baris berikut ke /etc/ssh/ssh_configfile:

ServerAliveInterval 60
minhas23
sumber
Apakah itu hanya berfungsi untuk klien atau apakah itu juga berfungsi untuk sshd?
Edward Coast
1
@EdwardCoast Ini berfungsi pada mesin Klien. Saya mengujinya di Mac
minhas23