Cara untuk menghindari batas waktu koneksi ssh & pembekuan Terminal GNOME

235

Ketika saya terhubung melalui ssh ke server tertentu, itu timeout dan "membekukan" terminal (tidak menerima input, tidak memutuskan, tidak dapat Ctrl-C untuk mematikan proses ssh atau apa pun).

Ini ada di Ubuntu, gnome-terminalmeskipun sepertinya sedang menghentikan input / output terminal, dan tidak memengaruhi operasi perangkat lunak Terminal GNOME itu sendiri. Jadi lebih sedikit bug dengan gnome-terminalinkonsistensi menjengkelkan dengan ssh.

Jadi, adakah cara untuk mencegah / mendapatkan kembali terminal dari koneksi ssh yang telah kehabisan waktu?

Kzqai
sumber

Jawaban:

256

sshd (server) menutup koneksi jika tidak mendengar apa pun dari klien untuk sementara waktu. Anda dapat memberi tahu klien Anda sesekali mengirim sinyal sign-of-life ke server.

Konfigurasi untuk ini ada di file ~/.ssh/config. Untuk mengirim sinyal setiap empat menit ke hosting jarak jauh, masukkan berikut ini di ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

Inilah yang saya miliki di blog saya ~/.ssh/config.

Untuk mengaktifkannya untuk semua host gunakan:

Host *
  ServerAliveInterval 240

Pastikan juga untuk menjalankan chmod 600 ~/.ssh/config, karena file konfigurasi tidak boleh dibaca dunia.

Ludwig Weinzierl
sumber
1
Terima kasih sblair untuk membantu saya dengan kata-kata, itu sangat dihargai Saya mengubah "seharusnya tidak" kembali ke "tidak boleh" karena ssh memeriksa izin file dan jika itu dunia atau grup dapat dibaca, gagal.
Ludwig Weinzierl
1
Ini bukan yang diminta OP. Dia tidak ditendang karena tidak aktif. Dia berusaha untuk terhubung dan terminalnya membeku.
Cerin
Dimana ini ~/.ssh/config?
Pengguna
1
@ Pengguna '~ /' mewakili folder rumah Anda. '.ssh' adalah folder di dalam folder rumah Anda.
wkm
6
ini tidak berguna jika koneksi Anda benar-benar hilang ...
so12311
248

Tekan Enter, ~, .satu demi satu untuk memutuskan sambungan dari sesi beku.

Bagian "ESCAPE CHARACTERS" di halaman manual ssh menjelaskan detail yang mendasarinya.

Peter Eisentraut
sumber
40
Bagi saya, jawaban ini muncul untuk menjawab pertanyaan dengan lebih akurat, dan bagaimanapun, adalah jawaban yang saya cari.
CoatedMoose
Perhatikan bahwa Anda perlu tanda komentar pada baris EscapeChar ~di /etc/ssh/ssh_config(atau ~/.ssh/ssh_configjika Anda suka).
Aditya MP
@adityamenon Tidak, EscapeChar ~sudah merupakan bawaan bawaan.
Peter Eisentraut
2
@Mark pertanyaannya bertanya "apakah ada cara untuk mencegah mendapatkan kembali terminal dari koneksi ssh yang telah kehabisan waktu ?" Tekankan milikku.
CoatedMoose
2
Walaupun itu tidak benar dalam konteks pertanyaan, ini adalah persis apa yang saya inginkan.
Subin Sebastian
38

Meskipun ini bukan jawaban langsung untuk pertanyaan Anda, itu sangat terkait dengan masalah yang Anda miliki. Alih-alih mencoba menjaga koneksi tetap hidup (semua koneksi akhirnya mati), Anda dapat menggunakan multiplexor terminal, seperti screendan tmuxyang membuat sesi tetap hidup di latar belakang bahkan jika terminal Anda terputus.

Intinya ketika Anda masuk ke server SSH Anda segera menjalankan screenyang akan membuat dan melampirkan sesi baru:

$ screen

Kemudian Anda pergi ke depan dan melakukan pekerjaan Anda dengan shell seperti biasa. Sekarang jika koneksi terputus, ketika Anda bisa kembali online dan terhubung kembali ke server melalui SSH, Anda mendapatkan daftar sesi saat ini dengan:

$ screen -ls

Untuk memasang kembali sesi:

$ screen -r <session>

di mana <session>PID atau nama sesi. Anda akan terhubung kembali ke sesi Anda dan Anda dapat melanjutkan dari tempat Anda tinggalkan!

Anda bahkan dapat melepaskan sesi dan menyambung kembali dari rumah untuk mengambil dari titik yang tepat di mana Anda tinggalkan. Untuk melepaskan sesi yang Anda gunakan C-adiikuti oleh C-d(thats Control + Akemudian Control + D).

Ada tutorial online yang sederhana juga.

Menggunakan screendan tmuxpada server jauh dianggap praktik terbaik dan sangat dianjurkan . Beberapa orang bahkan memiliki screenshell login default mereka, jadi ketika mereka terhubung mereka segera memulai screensesi baru .

foto
sumber
2
Alternatif lain adalah menggunakan mosh: mosh.mit.edu
Zombies
Ini sangat berguna jika Anda menggunakan hotspot atau wifi yang terkadang mati.
Randall
11

Coba tambahkan -o ServerAliveInterval=30ke string koneksi Anda ( 30artinya 30 detik dan tentu saja dapat disesuaikan)

Fergie
sumber
1

Untuk orang-orang yang ingin mencegah klien dari waktu keluar di tempat pertama.

Anda dapat mencoba mengatur ConnectTimeout 0di file konfigurasi. Nilai 0 berarti koneksi akan tetap hidup tanpa batas waktu kecuali ditutup.

file config (atau ssh_config) Anda mungkin terlihat seperti ini:

Host *
   ConnectTimeout 0
Yohannes Libanos
sumber