Saya telah melihat ini dengan begitu banyak konsol (di Linux, Mac, ...), dan dengan banyak mesin yang berbeda di banyak jaringan berbeda. Saya tidak pernah dapat menunjukkan alasan yang tepat, mengapa ini terjadi: Yang harus Anda lakukan adalah masuk ke mesin melalui SSH. Jika koneksi terputus karena alasan tertentu (untuk kesederhanaan, katakanlah kabel jaringan ditarik), maka kadang-kadang konsol hanya hang selamanya - di waktu lain, itu hanya keluar dengan baik ke shell induk.
Ini sangat menjengkelkan ketika ini terjadi (misalnya Anda kehilangan sejarah perintah.) Apakah mungkin ada pintasan keyboard rahasia yang dapat memaksa keluar (Ctrl-C atau Ctrl-D tidak berfungsi)? Dan apa alasan untuk "bug" acak ini di semua implementasi?
networking
ssh
connection
console
Chris Lercher
sumber
sumber
Jawaban:
Ada pintasan keyboard "rahasia" untuk memaksa keluar: ~) Dari sesi yang dibekukan, tekan tombol-tombol ini secara berurutan: Enter~.Tilde (hanya setelah baris baru) dikenali sebagai urutan keluar oleh klien ssh, dan periode memberi tahu klien untuk menghentikan bisnisnya tanpa basa-basi lagi.
Perilaku lama dalam masalah komunikasi bukanlah bug, sesi SSH nongkrong berharap pihak lain akan kembali. Jika jaringan rusak, kadang-kadang bahkan beberapa hari kemudian Anda bisa mendapatkan sesi SSH kembali. Tentu saja Anda dapat secara khusus mengatakannya untuk menyerah dan mati dengan urutan di atas. Ada juga berbagai hal yang dapat Anda lakukan seperti mengatur timeout tetap-hidup di klien Anda sehingga jika itu tidak memiliki tautan aktif untuk jumlah waktu tertentu itu mati sendiri, tetapi perilaku default adalah tetap sebagai terhubung mungkin!
Sunting: Aplikasi lain yang bermanfaat dari kunci interupsi ini adalah untuk mendapatkan perhatian dari klien ssh lokal dan latar belakang untuk kembali ke shell lokal Anda sebentar — katakanlah untuk mendapatkan sesuatu dari sejarah Anda — kemudian tarik untuk tetap bekerja dari jarak jauh. Enter~ Ctrl+ Zuntuk mengirim klien ssh ke antrian pekerjaan latar belakang shell lokal Anda, lalu
fg
seperti biasa untuk mendapatkannya kembali.Sunting: Saat berhadapan dengan sesi SSH bersarang, Anda dapat menambahkan beberapa karakter tilde untuk hanya keluar dari salah satu sesi SSH dalam rantai, tetapi mempertahankan yang lainnya. Misalnya, jika Anda bersarang dalam 3 level, (yaitu Anda ssh dari lokal-> Machine1-> Machine2-> Machine3), Enter~.akan membuat Anda kembali ke sesi lokal Anda, Enter~~.akan meninggalkan Anda di Machine1, dan Enter~~~.akan meninggalkan Anda di Machine2 . Ini juga berfungsi untuk urutan pelarian lainnya, seperti memindahkan sesi ssh ke latar belakang sementara. Cara di atas berfungsi untuk semua level sarang, dengan menambahkan lebih banyak tilde.
Terakhir, Anda dapat menggunakan Enter~?untuk mencetak menu bantuan dari perintah escape yang tersedia.
TL; DR - perintah pelarian yang didukung adalah urutan pelarian yang didukung:
sumber
~/.somethingorother
setelah menekan enter)?man ssh
membahas hal ini di bawahESCAPE CHARACTERS
bagian ini.~.
(Putus) dan~^Z
(latar belakang ssh) sangat praktis.SSH menawarkan fasilitas tetap hidup. Tambahkan berikut ini ke lokal Anda
~/.ssh/config
(buat jika tidak ada):Pengaturan ini akan menghasilkan sinyal tetap hidup yang dikirim setiap 15 detik melalui terowongan aman. Setelah tiga kegagalan berturut-turut, klien SSH akan keluar.
Perhatikan bahwa pada beberapa sistem (termasuk macOS 10.14) sebagai gantinya harus:
Diambil dari jawaban ini di ask.ubuntu: https://askubuntu.com/a/29967/30266
sumber
Fakta bahwa itu hang adalah fungsi dari TCP, bukan SSH. Aplikasi tidak memiliki cara untuk mengetahui bahwa sesi / koneksi TCP telah terputus kecuali TCP menginformasikan aplikasi menggunakan koneksi bahwa koneksi sudah tidak ada lagi. Dari perspektif masing-masing host, sesi TCP masih dalam kondisi mapan dan tidak ada yang mengatakan bahwa sesi lama (tidak ada data mengalir) tidak valid selain RST atau kurangnya respons terhadap paket TCP keepalive (yang tidak diterapkan secara universal). Bagi saya itu bukan bug di SSH, saya mengharapkan perilaku itu.
sumber
Jika koneksi digantung dengan benar, semua keystroke ajaib tidak akan bisa lewat karena koneksi sudah digantung sebelum Anda mengeluarkan tombol yang ditekan. Anda dapat memberi tahu klien untuk mengakhiri tetapi ini tidak akan memengaruhi riwayat disimpan (atau tidak) di ujung server.
Meskipun ini tidak benar-benar menjawab pertanyaan, ini dapat membantu mengurangi efek hang koneksi: ketika saya bekerja dari jarak jauh (dan bahkan biasanya ketika saya tidak) saya menjalankan
screen
(dengan atau tanpabyobu
bungkus tergantung pada ketersediaannya) sehingga jika ada koneksi apa pun menjatuhkan sesi saya, dengan semua riwayatnya, dipertahankan dan tersedia dalam keadaan saya meninggalkannya ketika saya menghubungkan kembali.sumber
exit
/logout
yang akan memecahkan masalah sejarah tanpa menggunakanscreen
.