Bagaimana menghubungkan kembali ke sesi ssh terputus

157

Apakah ada cara untuk terhubung ke sesi ssh yang terputus? Kami mengalami masalah dengan koneksi jaringan kami ke situs jarak jauh yang sedang kami kerjakan secara terpisah; namun, sementara itu kami mengalami sejumlah besar pemutusan karena paket yang hilang saat terhubung ke server di lokasi yang jauh. Sering kali sesi tetap aktif untuk sementara waktu, dan kadang-kadang terjadi di tengah-tengah beberapa tindakan (mengedit file, menjalankan beberapa proses, dll ...) yang saya butuhkan untuk kembali daripada memulai kembali jika mungkin.

kuda pucat
sumber
10
Saya tidak percaya tidak ada yang menyebutkan mosh.mit.edu
jwbensley
@javano: Saya belum pernah mendengarnya. Tambahkan itu sebagai jawaban!
kbyrd
@kbyrd Telah selesai;)
jwbensley
pertanyaan serupa diajukan di unix.stackexchange.com/questions/105001/… dengan beberapa petunjuk tentang bagaimana cara mengatasi pemutusan hubungan di tempat pertama ...
anarcat

Jawaban:

136

PEMBARUAN: Untuk jawaban aktual, lihat jawaban zero_r di bawah ini

Ini bukan jawaban, tapi solusi. Gunakan layar .

Ketika Anda pertama kali masuk, jalankan layar. Anda mendapatkan shell lain, jalankan perintah di dalamnya. Jika Anda terputus, proses layar menjaga terminal tetap hidup sehingga shell Anda dan proses yang sedang berjalan tidak jatuh. Saat Anda terhubung kembali, jalankan 'layar -r' untuk melanjutkan.

Ada banyak lagi yang harus dikonfigurasikan dan menggunakan layar, tetapi hal di atas seharusnya bisa menyelesaikan masalah Anda.

kbyrd
sumber
18
Atau gunakan tmux - layar 'lebih dingin', saya telah menggunakan keduanya dan lebih suka tmux karena Anda dapat membagi istilah dengan baik.
John Hunt
3
Saya senang menemukan screensudah terinstal di Ubuntu 12.x saya jadi jika Anda tidak yakin coba saja perintah ini, itu memang menyambung kembali dan melanjutkan proses do-release-upgrade : layar sudo -D -r
bjm88
1
@ bjm88, sudoharus digunakan hanya jika sesi layar asli dimulai dengan sudo. Kalau tidak, itu akan kembali seolah-olah tidak ada sesi layar:There is no screen to be detached
Noam Manos
+1 Saya menyadari ini bukan jawaban yang sebenarnya; Namun, screen -ritu persis apa yang saya cari.
Eric Nelson
130

Cobalah untuk mengatur ClientAliveInterval (mis. 60) dan TCPKeepAlive (ya atau tidak) ke nilai yang sesuai di server sshd.conf.

Ini akan membuat sesi Anda tetap hidup meskipun koneksi hilang selama beberapa menit.

zero_r
sumber
24
Sejauh ini, Anda tampaknya menjadi satu-satunya yang benar-benar menjawab pertanyaan alih-alih menyarankan layar sebagai solusi.
kbyrd
2
Panggilan yang bagus. Kami menemukan metode ini sangat berguna ketika melintasi firewall cisco ASA / PIX, yang secara default suka waktu habis koneksi tcp.
Mike Pountney
5
Mungkin ini bukan tempat yang tepat untuk bertanya, tetapi mungkinkah poster itu mengalihkan jawaban? Kita harus menjawab 'layar' (milik saya bukan yang terbaik, saya suka Mike Pountney, tetapi saya mendapat perwakilan) dengan informasi ini.
kbyrd
1
Apakah ini akan berfungsi ketika terhubung melalui koneksi Cisco VPN, dan koneksi VPN hilang dan dibangun kembali?
Brent
bagi saya layar berfungsi sempurna, saya dapat menyambung kembali ke tugas yang disaring dan countiune to work
integratorIT
65

Seperti disebutkan di atas, Layar GNU adalah caranya. Ini akan memungkinkan Anda untuk memiliki 'sesi layar' pada kotak jarak jauh di mana Anda dapat menjalankan banyak perintah, melalui beberapa 'layar windows'. Ini hanya akan melepaskan jika koneksi SSH orang tua Anda mati, menjaga semua subproses berjalan di dalamnya hidup dan sehat.

' man screen' adalah teman Anda seperti biasa, dan paket OS harus dipanggil ' screen' jika tidak diinstal secara default.

Dasar-dasarnya adalah:

  • Mulai sesi layar (pada host jarak jauh Anda):

    $ screen
    
  • Memutuskan sambungan dari sesi layar Anda: CTRL-A,d

  • Sambungkan kembali ke sesi layar Anda setelah masuk kembali:

    $ screen -d -r
    
  • Buka lain layar 'jendela': CTRL-A,c

  • Siklus melalui Anda layar terbuka jendela: CTRL-A,space

Ada banyak hal keren yang bisa Anda lakukan dengan Layar. Saya telah menggunakannya selama lebih dari 10 tahun, dan masih mencari tahu fitur-fitur baru. Ini utilitas Unix favorit saya.

Mike Pountney
sumber
1
Ya, ini adalah jawaban yang jauh lebih baik daripada saya.
kbyrd
Dapatkah saya tetap terhubung ke sesi ssh yang terputus, jika saya me-reboot pc saya di mana layar berjalan?
BarathVutukuri
tmux lebih kuat
Pegasus
46

Saya tidak percaya tidak ada yang menyebutkan MOSH ;

Mosh adalah protokol terpisah yang dapat menghubungkan ke proses login SSH, itu membuat sesi Anda tetap hidup setelah berhari-hari terputus, mengubah IP, latensi tinggi dan sebagainya. Itu dijelaskan di halaman rumah lebih baik daripada yang bisa saya jelaskan sehingga saya telah menyalin deskripsi di bawah ini. Pengalaman dan saran saya adalah bahwa saya menggunakannya di ponsel Android saya, ini adalah penyelamat saat bepergian dan SSH'ing. Hal yang sama berlaku di laptop saya ketika ditambatkan dengan ponsel di kereta misalnya. Saya merekomendasikan kompilasi dari sumber untuk mendapatkan versi terbaru, versi repo untuk saya di dalam Ubuntu memiliki beberapa gangguan di dalamnya yang diperbaiki dalam versi terbaru (pada saat penulisan).

Mosh (shell ponsel)

Aplikasi terminal jarak jauh yang memungkinkan roaming, mendukung konektivitas terputus-putus, dan menyediakan gema lokal yang cerdas dan pengeditan garis penekanan tombol pengguna.

Mosh adalah pengganti SSH. Ini lebih kuat dan responsif, terutama melalui Wi-Fi, seluler, dan sambungan jarak jauh.

Mosh adalah perangkat lunak gratis, tersedia untuk GNU / Linux, FreeBSD, Solaris, Mac OS X, dan Android.

Fitur dari situs web:

  • Ubah IP. Tetap terhubung : Mosh otomatis menjelajah saat Anda bergerak di antara koneksi Internet. Gunakan Wi-Fi di kereta, Ethernet di hotel, dan LTE di pantai: Anda akan tetap masuk. Sebagian besar program jaringan kehilangan koneksi setelah roaming, termasuk SSH dan aplikasi Web seperti Gmail. Mosh berbeda.

  • Membuat mimpi indah : Dengan Mosh, Anda dapat meletakkan laptop Anda untuk tidur dan membangunkannya nanti, menjaga koneksi Anda tetap utuh. Jika koneksi Internet Anda turun, Mosh akan memperingatkan Anda - tetapi koneksi kembali ketika layanan jaringan kembali.

  • Singkirkan jeda jaringan : SSH menunggu balasan server sebelum menunjukkan kepada Anda pengetikan Anda sendiri. Itu bisa membuat antarmuka pengguna yang buruk. Mosh berbeda: ia memberikan respons instan untuk mengetik, menghapus, dan mengedit garis. Ia melakukan ini secara adaptif dan bekerja bahkan dalam program layar penuh seperti emacs dan vim. Pada koneksi yang buruk, prediksi luar biasa digarisbawahi sehingga Anda tidak akan disesatkan.

  • Tidak ada kode istimewa. Tanpa daemon : Anda tidak perlu menjadi pengguna super untuk menginstal atau menjalankan Mosh. Klien dan server adalah executable yang dijalankan oleh pengguna biasa dan hanya berlangsung selama umur koneksi.

  • Metode login yang sama : Mosh tidak mendengarkan port jaringan atau mengautentikasi pengguna. Klien mosh masuk ke server melalui SSH, dan pengguna menyajikan kredensial yang sama (misalnya, kata sandi, kunci publik) seperti sebelumnya. Kemudian Mosh menjalankan mosh-server dari jarak jauh dan menghubungkannya melalui UDP.

  • Berjalan di dalam terminal Anda, tetapi lebih baik : Mosh adalah program baris perintah, seperti ssh. Anda dapat menggunakannya di dalam xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, layar, atau tmux. Tapi mosh dirancang dari awal dan hanya mendukung satu set karakter: UTF-8. Ini memperbaiki bug Unicode di terminal lain dan di SSH.

  • Control-C berfungsi dengan baik : Tidak seperti SSH, protokol berbasis UDP mosh menangani kehilangan paket dengan anggun, dan menetapkan kecepatan bingkai berdasarkan kondisi jaringan. Mosh tidak mengisi buffer jaringan, jadi Control-C
    selalu bekerja untuk menghentikan proses pelarian.

jwbensley
sumber
8
Mosh bukan pembungkus ssh - ini adalah protokol yang berbeda, hampir seluruhnya tidak terkait dengan ssh (hanya menggunakan ssh untuk login).
jch
+1 Sangat benar, kesalahan saya.
jwbensley
2
Bagaimana dengan keamanan, kawan di tengah? enkripsi? pertukaran kunci?
Nasir Iqbal
Mosh terlihat mengagumkan, meskipun sayangnya tidak mendukung port forwarding belum .
Boann
20

autossh melihat koneksi Anda dan jika koneksi turun, koneksi kembali. Ini lebih dapat diandalkan daripada keepalives. Jika Anda terhubung ke sesi layar, Anda akan melanjutkan langsung dari tempat Anda terputus (lihat rscreenyang datang dengan autossh)

hayalci
sumber
1
di luar keep-live yang dapat dikonfigurasi, itu secara inheren tidak memungkinkan Anda untuk terhubung kembali ke sesi (apa yang dicari OP). tetapi autossh dapat sangat membantu untuk aplikasi yang membutuhkan terowongan ssh, pemetaan port, dll.
ives
ya layar autossh + akan menjadi sweet spot. autossh punya rscreenuntuk ini.
hayalci
Autossh lebih baik dari mosh. Saya sudah menggunakan keduanya.
Sridhar Sarnobat
Berikut posting blog oleh Jesse Keating, tentang menggunakan autossh dengan layar .
sampablokuper
12

tmux

Yang ini klasik. Gunakan setiap kali Anda berisiko kehilangan koneksi ke terminal.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

Sama seperti itu, Anda kembali beraksi.

Jacksonkr
sumber
Terima kasih banyak! Saya mencari cara untuk melakukan ini dengan tmux, karena tampaknya itulah yang dianggap kebanyakan orang sebagai pilihan yang lebih baik.
CoolOppo
10

Saya akan menginstal dan memulai layar untuk memperbaiki masalah Anda. Layar akan memungkinkan Anda terhubung kembali ke sesi layar sebelumnya.

Selain itu, layar juga memungkinkan Anda melakukan hal-hal keren seperti membagi layar, melihat konsol, dll. Anda dapat menemukan info lebih lanjut di sini dan di sini .

Sebagai permulaan, jika Anda terputus, Anda dapat menggunakan

screen -ls

untuk melihat sesi Anda dan

screen -r ${session} 

untuk menyambung kembali ke yang terputus.

wzzrd
sumber
4

Seperti yang telah ditunjukkan oleh orang lain, layar umumnya merupakan solusi terbaik untuk ini dan ia menambahkan sejumlah fitur berguna lainnya juga.

Anda dapat mengatur profil Anda pada mesin jarak jauh untuk secara otomatis memulai dan / atau menyambung kembali ke layar saat login, yang membuat Anda lupa untuk memulai layar pada saat Anda membutuhkannya karena Anda mengalami penurunan koneksi.

Lihat http://tlug.dnho.net/?q=node/239 (atau cari Google untuk banyak contoh lainnya dengan cara yang sedikit berbeda).

David Spillett
sumber
3

alternatif yang lebih modern untuk layar, sayangnya tidak tersedia untuk beberapa jenis "virtualisasi" (misalnya di cygwin Anda dapat memiliki "layar", tetapi tidak "tmux" karena cara itu dirancang), tetapi di mana pun Anda memiliki pilihan untuk menginstal tmux , Saya sangat merekomendasikan untuk menggunakan insted layar itu.

cepal
sumber
3

Berikut ini adalah solusi non-layar lainnya.

Baki dempul memungkinkan Anda untuk melakukan hal itu, ia memiliki koneksi ulang pada opsi putuskan yang tidak biasa atau dempul-ng

https://puttytray.goeswhere.com/

itu adalah garpu (sepenuhnya open source) dari dempul dengan opsi lain, pergi ke pengaturan koneksi dan ada 2 pilihan, satu untuk 'upaya untuk menyambung kembali pada kegagalan koneksi', dan 'upaya untuk menghubungkan kembali pada startup'.

munkiepus
sumber
1
Ehh. Apakah itu datang dengan keylogger dan utilitas exfiltrasi ppk otomatis?
Pemburu Rusa
1
Saya berasumsi Anda bertanya apakah entah bagaimana, mencuri detail Anda, ini sepenuhnya open source, kode sumber tersedia di github jika Anda ingin melihat github.com/FauxFaux/PuTTYTray ada beberapa kontributor: )
munkiepus
tepuk tangan yang bagus :)
munkiepus
2

Sementara layar akan membuat sesi shell Anda terbuka di server jauh jika sesi ssh Anda turun, itu tidak akan melakukan apa-apa tentang masalah koneksi ssh yang dijatuhkan. Seperti yang disarankan zero_r, coba setel koneksi ssh Anda dengan tetap hidup dan batas waktu lama.

Saya sarankan Anda melacak penyebab hilangnya paket yang menyebabkan masalah dan memperbaikinya alih-alih mengatasinya.

David
sumber
Terima kasih untuk sarannya. Kami sedang berupaya melacak masalah root dari packet loss, hanya perlu beberapa saat untuk mengetahuinya (sangat rumit, ini!). Ini benar-benar merupakan solusi untuk periode masalah ini. Orang tidak pernah tahu kapan sesuatu akan menyebabkan koneksi terputus.
palehorse
1
Ini akan menghasilkan banyak suara, tetapi Anda dapat mencoba menjalankan ssh melalui strace dan melihat apa yang dilakukannya / melaporkan ketika koneksi ssh turun. Mungkin hanya melaporkan apa yang sudah Anda tahu, tapi siapa yang tahu ...
David
1

Terkadang saya lupa untuk menjalankan layar juga dan kehilangan pekerjaan saya yang belum selesai. Dalam hal ini, meskipun kami tidak dapat melampirkan kembali ke sesi SSH yang rusak, memperbaiki program yang sedang berjalan ke terminal baru dan melanjutkan apa yang Anda lakukan masih dimungkinkan berkat reptyr.

Setelah secara tidak sengaja terputus dari sesi SSH, hal pertama yang pertama adalah menjalankan screenagar koneksi tidak terputus lagi. Kemudian di sesi baru, jalankan ps aux | grep {The process to be resumed}untuk mendapatkan PID. Dengan PID, Anda dapat mencoba reptyr {PID}atau reptyr -T {PID}(jika ada subproses) untuk melanjutkan pekerjaan.

march_happy
sumber