Bagaimana saya bisa mencegah sesi SSH menggantung di Terminal OS X?

101

Ketika saya menutup MacBook saya dengan sesi SSH aktif di Terminal dan kemudian membangunkannya, prompt tidak merespons.

Dalam sekitar lima menit tertulis

Write failed: Broken pipe

dan berakhir.

Ini juga terjadi ketika saya tidak mengetik apa pun di Terminal dalam waktu sekitar lima belas menit.

Bisakah saya memaksa OS X untuk:

  1. Pertahankan koneksi SSH tetap hidup untuk waktu terpanjang
  2. Bunuh segera setelah menjadi tidak responsif

?

Dan
sumber

Jawaban:

121

Untuk menjaga koneksi tetap hidup , Anda dapat memeriksa di /etc/ssh/ssh_configbaris di mana dikatakan ServerAliveInterval, yang memberitahu Anda seberapa sering (dalam detik) komputer Anda akan mengirim paket nol untuk menjaga koneksi tetap hidup. Jika Anda memiliki 0 di sana yang menunjukkan bahwa komputer Anda tidak mencoba untuk menjaga koneksi tetap hidup (dinonaktifkan), jika tidak ia memberitahu Anda seberapa sering (dalam detik) mengirim paket yang disebutkan di atas. Coba masukkan 120 atau 240, jika masih mematikan koneksi Anda, Anda bisa turun, mungkin ke 5, jika dengan nomor itu tidak terjadi, mungkin router Anda yang membuang koneksi ke memori bebas.

Untuk membunuhnya saat hang up , Anda dapat menggunakan karakter ssh escape:

~.

Yaitu, tekan tilde dan kemudian titik, jika tidak bekerja, tekan Enter sebelum Anda menekan itu, yang akan segera mematikan koneksi.

Jorge Núñez
sumber
3
Ok, Anda dapat mematikan koneksi dengan ~., tip yang bagus! Tetapi apa yang sebenarnya dilakukannya?
CousinCocaine
Satu-satunya hal yang saya bingung tentang apakah atau tidak saya harus memulai kembali sshd, tetapi sepertinya hanya keluar dari sesi dan menghubungkan kembali melakukan trik
dgig
Seringkali ~. tidak bekerja untuk saya selama beberapa menit. Mengapa demikian?
Sridhar Sarnobat
2
Lokasi ssh_configada /etc/ssh/ssh_configdi Mac OS X. Saya akan mengedit sendiri jawabannya, tetapi saya tidak punya cukup perwakilan di situs ini untuk melakukannya.
Erik B
saya harus memasukkan ini ke klien atau server? Saya pikir klien, tetapi bisa lebih jelas.
EralpB
23

Kamu bisa:

Konfigurasikan sistem Anda, seluruh sistem, untuk semua koneksi Dengan mengedit: / etc / ssh / ssh_config Dan tambahkan baris:

ServerAliveInterval 10

Atau, per-server ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Apa yang pada dasarnya ini ia lakukan mengirim paket tetap hidup, setiap 10 detik ...

Aleksandar Pavić
sumber
9

Anda juga dapat mencoba menggunakan proyek mosh yang mengagumkan . Itu akan dengan anggun menangani kehilangan jaringan, mesin akan tidur, dll dan dengan senang hati memulihkan koneksi ketika Anda memiliki jaringan yang berfungsi lagi.

Solusi lain yang lebih dihargai adalah menggunakan tmux pada mesin jarak jauh. Dalam hal ini Anda mungkin masih mendapatkan pipa yang rusak, tetapi jika Anda menghubungkan kembali shell Anda dan aplikasi akan menunggu tepat ketika Anda meninggalkannya.

BinaryPaean
sumber
Sebenarnya, itulah yang saya lakukan sekarang.
Dan
5

Berbagai jawaban di sini bertentangan mengenai jalur persis ke file konfigurasi. Mungkin berbeda di berbagai unix? Saya sarankan membaca halaman manual pada sistem Anda!

Di man ssh (1) , cari teks: config . Di sistem saya, saya memiliki pilihan file konfigurasi sistem-lebar atau pengguna-ini (dan jalurnya sangat berbeda).

Di man ssh_config (5) , cari teks: hidup . Pada sistem saya, sepertinya saya perlu mengatur ServerAliveInterval dan ServerAliveCountMax .

Apa yang berhasil bagi saya, di macOS 10.12 Sierra, adalah untuk meletakkan dua baris berikut di ~ / .ssh / config:

ServerAliveInterval 20
ServerAliveCountMax 180

Sekarang saya dapat ssh ke server Ubuntu 16.04 saya tanpa putuskan selama 20 * 180 detik = 1 jam. Membuatku bahagia!

Jerry Krinock
sumber
3

Secara otomatis menyambungkan kembali ssh setelah tidur atau gangguan wifi

  1. Instal autossh dari MacPorts atau Homebrew:brew install autossh

  2. Buka Terminal dan jalankan autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. Putuskan koneksi wifi Anda atau matikan Mac Anda.

  4. Ketika Anda terhubung kembali ke wifi, sesi ssh akan secara otomatis terhubung kembali.


Secara otomatis ssh setelah masuk

Jon Stacey menulis posting blog tentang secara otomatis mengaktifkan sesi ssh ketika Anda login.

  1. Instal autossh dari MacPorts atau Homebrew:brew install autossh

  2. Buat alur kerja Automator dengan skrip bash.

Script shell automator

  1. Masuk ke item login di System Preferences .

Preferensi Sistem> Item masuk

  1. Tambahkan alur kerja Automator Anda ke item Login .

Item masuk

Kamil Slowikowski
sumber
1

Tambahkan dua baris ini ke /etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes
MOHRE
sumber
1

Baru saja menyelesaikan masalah ini, tambahkan baris berikut ini di $HOME/.ssh/config.

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

Pengaturan TCPKeepAlive nomemberi tahu klien untuk hanya menganggap koneksi masih baik sampai dibuktikan sebaliknya oleh permintaan pengguna, yang berarti bahwa koneksi sementara terputus saat istilah ssh Anda sedang diam di latar belakang tidak akan mematikan koneksi.

Nur Rony
sumber