Saya sering harus terhubung ke server melalui ssh di lingkungan wifi yang tidak dapat diandalkan. Di server, saya menjalankan layar, jadi jika saya terputus, saya dapat menyambung kembali dan melanjutkan sesi layar, dan mengambil di mana saya tinggalkan, tetapi kehilangan koneksi masih merupakan tenggang waktu utama: jika koneksi terputus saat saya Sedang di server, jendela terminal cenderung membeku. Saya harus membunuh tab itu, buka yang baru, ssh ke server lagi dan melanjutkan sesi layar. Saya sudah mencoba ini dengan menjalankan layar pada server dan layar secara lokal. Apa pun itu cenderung membeku ketika koneksi putus.
Apakah ada cara saya dapat memiliki sesuatu yang mirip dengan layar, atau mungkin layar itu sendiri, yang secara otomatis akan mencoba menyambung kembali dan menjaga sesi berjalan, jadi saya tidak harus terus terhubung kembali secara manual? Seringkali ketika saya kehilangan koneksi saya pikir itu hanya untuk periode yang sangat singkat - mungkin kurang dari satu detik.
Saya menggunakan Ubuntu 14.04 LTS, edisi MATE. Terima kasih
sumber
<Enter>
dan ketik~.
untuk memberi tahu sisi Anda untuk menjatuhkan koneksi, dan Anda cukup mengulangi perintah ssh terakhir untuk menyambung kembali (misalnya dengan panah atas atau!!
).Jawaban:
Anda dapat melihat menggunakan
mosh
: https://mosh.org/Anda dapat mengatur server 'lompatan' dengan koneksi internet yang andal yang Anda gunakan
mosh
untuk terhubung, lalu mengadakanssh
sesi untuk setiap server yang Anda kelola. Alasan saya menyarankan menggunakan server lompat adalah bahwa Anda mungkin tidak ingin menginstalmosh
pada server yang Anda kelola.Keuntungan lain
mosh
adalah didasarkan pada UDP daripada TCP, dan sesi Anda dapat bertahan dari perubahan alamat IP, misalnya beralih dari WiFi ke koneksi internet seluler.Hanya untuk memperjelas,
mosh
bukan penggantiscreen
, melainkanssh
. Itu masih merupakan ide yang baik untuk digunakanscreen
, karenamosh
itu sendiri tidak menyediakan cara untuk menyambung kembali ke sesi Anda jika klien meninggal karena alasan tertentu.sumber
Saya telah menggunakan
tmux
selama beberapa tahun sekarang dan dalam pengalaman saya, itu terhubung kembali secara otomatis. Setidaknya ketika koneksi hanya gagal untuk waktu yang relatif singkat. Perhatikan bahwa saya benar-benar menggunakanbyobu
dengan tmux sebagai backend. Saya tidak tahu apakah kekokohan ini adalah fiturtmux
ataubyobu
atau bahkan kombinasi keduanya, tapi saya sarankan Anda mencoba keduanya.Saya terhubung dari Arch instalasi lokal saya ke berbagai server Ubuntu jarak jauh melalui VPN. Saya mengujinya sekarang dengan mencabut kabel jaringan saya saat saya terhubung ke remote. Sesi itu terhenti, tetapi begitu kabel saya dicolokkan lagi, ia kembali lancar.
Namun, ketika saya diuji dengan me-restart router saya, koneksi tidak kembali. Saya berasumsi itu ada hubungannya dengan berapa lama jaringan itu mati, tetapi tampaknya untuk menyambung kembali jika hanya turun beberapa detik.
Dalam hal ini relevan, saya melakukan semua ini menggunakan
terminator
emulator terminal saya.Ketiganya tersedia di repositori Ubuntu:
Namun, saya sama sekali tidak yakin bahwa salah satu
tmux
ataubyobu
lebih baik dalam menangani pemutusan ssh. Saya hanya tahu bahwa dalam pengalaman saya, mereka sering kembali dari kehilangan koneksi singkat. Itu mungkin ke aspek lain dari konfigurasi saya.sumber
tcp
koneksi. Dari pengalaman sayassh
bisa sangat tangguh untuk putus jaringan terputus-putus, saya tidak berpikir ini ada hubungannya dengan fakta yang Anda gunakantmux
di dalamssh
jendela.ClientAlive
/ServerAlive
memicu, atau ... Saya tidak tahu apa yangbyobu
terjadi, meskipun .tmux
pada dasarnya adalah alternatif yang lebih modernscreen
, ya. Ketika saya pertama kali mulai bekerja seperti yang saya lakukan sekarang dan membutuhkan hal semacam ini, bacaan sepintas saya menyarankan itutmux
adalah pilihan yang lebih baik hari ini. Saya juga tidak 100% yakin ini memiliki manajemen koneksi yang hilang yang lebih baik, yang saya tahu adalah pemulihan dari pemadaman singkat dalam pengalaman saya. Entah itu tergantung padatmux
atau sesuatu yang lain, saya tidak tahu. Tapi sepertinya patut dicoba :). Byobu pada dasarnya adalah sebuah frontend to screen / tmux, bukan emulator terminal GUI. Ini sangat berguna: byobu.orgGunakan
ServerAlive
opsi ssh untuk mendeteksi ketika koneksi gagal.Jadi, jika Anda menetapkan
ServerAliveInterval
ke 5,ssh
akan terputus secara otomatis jika jaringan terkelupas selama 15 detik.sumber
~.
(atau Enter pertama, lalu~.
) yang terdiri dari: karakter pelarian~
dan perintah untuk memutus sesi.
Dalam kondisi yang sama, saya cenderung menggunakan
eshell
TRAMP (over ssh) di dalam Emacs. TRAMP menangani penyambungan kembali bila perlu tanpa menyebabkan banyak masalah bagi saya memberikan perintah yang diinginkan untuk shell jarak jauh.Namun, eshell tidak sebagus terminal, yaitu untuk menjalankan perintah yang melakukan sesuatu yang istimewa dengan terminal, atau yang berjalan untuk periode waktu yang signifikan secara terus-menerus (secara bertahap) mencetak sesuatu.
Pada dasarnya, cukup mudah untuk mulai menggunakannya di Emacs dengan TRAMP:
sumber
Penolakan
Jika koneksi SSH Anda tidak bertahan dari pemadaman jaringan singkat, maka ada sesuatu yang terjadi yang tidak memungkinkan
ssh
dan TCP melakukan hal normal mereka.Lihat di bawah untuk detailnya. Bagaimanapun:
Solusi Tanpa-Dependensi Tercepat dan Terkotor
Buat skrip shell seperti ini:
Ini hanya akan menjalankan loop bodoh-sederhana yang terus berusaha terhubung
ssh
dan dilampirkanscreen
. Lewati host atau apa pun yang biasanya Anda berikan padassh
permohonan Anda sebagai argumen baris perintah.Sambungan ulang hanya didasarkan pada apakah SSH melaporkan kesalahan dengan koneksi, yang berarti ia tidak memiliki kecerdasan untuk mendeteksi kesalahan non-SSH seperti "Anda benar-benar tidak mengaktifkan WiFI" atau apa pun, tetapi itu mungkin tidak masalah untuk kamu.
Saya berasumsi Anda memiliki
ssh-agent
atau kunci SSH tanpa-frasa sandi yang akan memungkinkan koneksi kembali berfungsi tanpa masukan tambahan dari Anda.Akan ada kondisi perlombaan kecil di mana jika Anda menekan
^C
pada fraksi yang tepat yang tidak dapat dilihat manusia sedetik pun selama penyambungan kembali, Anda bisa berakhir dengan membunuh skrip alih-alih meneruskannya^C
ke terminal klien, jadi jika Anda mencurigai koneksi hang jangan tumbuk^C
terlalu bersemangat.Solusi Perangkat Lunak Tambahan Sederhana
Anda dapat mencoba program autossh , yang seharusnya tersedia di repositori paket Ubuntu Anda.
Jika Anda perlu membangun dari sumber atau mengauditnya, ini adalah program C tunggal yang mengkompilasi tanpa pustaka tambahan sebagai dependensi, tampaknya memiliki lebih banyak intelijen tentang memeriksa keaktifan koneksi daripada retasan saya di atas, dan juga dikirimkan dengan
rscreen
perintah skrip yang mudah yang otomatis -terhadapscreen
.Detail
Bagaimana
ssh
biasanya pulihHanya untuk memverifikasi, karena saya tidak suka mengatakan sesuatu tanpa memeriksa diri saya sendiri, saya melakukan sedikit tes sebelum menjawab:
Saya menggunakan WiFi dengan perangkat Linux, membuat koneksi SSH ke perangkat lain di LAN saya, memverifikasi bahwa saya memiliki
ssh
koneksi yang berfungsi ke ujung lainnya (dapat menjalankan perintah, dll), kemudian pada klien memutus WiFi (menyebabkan antarmuka untuk tidak dikonfigurasikan: tidak ada lagi alamat IP), mengetikkan lebih banyak karakter ke dalam sesi ssh (tentu saja tidak ada respons), dan kemudian terhubung kembali ke WiFi saya - koneksi ulang sebenarnya gagal setidaknya sekali karena sinyal buruk dan faktor lainnya , kemudian akhirnya terhubung kembali: Saya menunggu sekitar lima detik hinggassh
sesi pulih, tidak ada yang terjadi sehingga saya menekan satu tombol lagi, danssh
sesi segera menjadi hidup kembali, dengan semua kunci yang saya ketik selama pemutusan muncul di baris perintah.Lihat,
ssh
hanya menulis / membaca ke soket jaringan TCP sampai OS mengatakan ada sesuatu yang salah, dan TCP sebenarnya sangat toleran terhadap penurunan koneksi yang berkepanjangan.Ditinggalkan ke perangkatnya sendiri dengan pengaturan kernel default, TCP stack di Linux dengan senang hati akan mentolerir koneksi yang benar-benar diam selama beberapa menit sebelum menyatakan koneksi mati dan melaporkan kesalahan ke
ssh
- pada saat akhirnya menyerah kita berbicara di stadion baseball itu. dari ~ 30 menit, atau setidaknya cukup lama untuk bertahan lebih lama dari cegukan koneksi yang berlangsung satu detik atau satu menit.Di bawah penutup, Linux TCP stack secara bertahap mencoba kembali pesan dengan penundaan yang lebih lama, yang berarti bahwa pada saat koneksi Anda kembali, Anda mungkin melihat jeda tambahan sebelum
ssh
sesi Anda tampaknya "hidup" lagi.Mengapa ini terkadang rusak
Seringkali ada sesuatu yang secara aktif menyebabkan koneksi ditutup setelah beberapa periode tidak aktif secara signifikan lebih pendek daripada jumlah yang akan ditoleransi oleh TCP stack, dan kemudian gagal melaporkan status koneksi tersebut ke
ssh
klien Anda .Calon yang mungkin termasuk:
Firewall atau NAT'ing router, yang harus menggunakan memori untuk mengingat setiap koneksi TCP langsung - sebagai optimasi dan beberapa mitigasi terhadap serangan DOS, mereka kadang-kadang hanya akan melupakan koneksi Anda, dan kemudian secara diam-diam mengabaikan paket konsekuen untuk itu, karena paket di tengah koneksi ketika Anda tidak ingat koneksi yang ada terlihat tidak valid.
Firewall / router berperilaku lebih baik akan menyuntikkan paket TCP RST, yang biasanya bermanifestasi sebagai
connection reset by peer
pesan kesalahan, tetapi paket reset adalah api-dan-lupa, jadi jika koneksi ke klien Anda masih mengalami masalah pada saat itu dan menjatuhkan Reset paket juga, klien Anda akan berpikir koneksi masih hidup.Server itu sendiri mungkin memiliki kebijakan firewall untuk secara diam-diam menjatuhkan paket yang tidak terduga, yang akan memutus upaya koneksi kembali klien setiap kali server menganggap koneksi ditutup tetapi klien tidak: klien Anda terus berusaha melanjutkan koneksi, tetapi server hanya mengabaikannya karena tidak ada koneksi langsung ke mana paket-paket ini berada dalam keadaan firewall server.
Karena Anda menjalankan Linux, hati-hati periksa server Anda
iptables
/ip6tables
(ataunft
jika Anda menggunakan hal-hal baru) untuk apa yang Anda izinkan vs menjatuhkan. Sangat umum untuk memperbolehkan paket baru / mapan / terkait pada port TCP SSH, tetapi bukan yang "tidak valid" - jika Anda secara diam-diam menghapus semua yang tidak diizinkan, pengaturan umum ini dapat menyebabkan pembekuan semacam ini setelah masalah koneksi singkat .Server SSH Anda sendiri mungkin dikonfigurasikan untuk menutup koneksi setelah beberapa saat tidak aktif, menggunakan salah satu opsi OpenSSH untuk paket kenang-kenangan klien TCP atau SSH. Dengan sendirinya ini tidak akan menyebabkan hang tidak terbatas, tetapi dapat menempatkan Anda di salah satu negara yang dijelaskan di atas.
Mungkin saja Anda tidak memberikan cukup waktu untuk "melepas" sendiri setelah Anda masuk ke keadaan di mana
ssh
sesi Anda ditutup.sumber