अस्वीकरण
यदि आपका SSH कनेक्शन संक्षिप्त नेटवर्क आउटेज से नहीं बच रहा है, तो कुछ और चल रहा है जो sshटीसीपी को अपनी सामान्य बात नहीं करने देता है।
जानकारी के लिए नीचे देखें। वैसे भी:
सबसे तेज और सबसे गंदा नहीं निर्भरता समाधान
इस तरह एक शेल स्क्रिप्ट बनाएं:
#!/bin/sh -
# Tune these numbers depending on how aggressively
# you want your SSH session to get reconnected.
timeout_options='-o ServerAliveInterval=4 -o ServerAliveCountMax=2'
# 255 is the status OpenSSH uses to signal SSH errors, which
# means we want to connect. All other exit statuses suggest
# an intentional exit.
status=255
# Keep opening the SSH connection and immediately dropping into
# `screen` until an intentional exit happens.
while [ "$status" = 255 ]
do
ssh $timeout_options -t "$@" screen -dR
status=$?
# You can add a `sleep` command here or a counter or whatever
# you might need as far as rate/retry limiting.
done
exit "$status"
यह सिर्फ एक बेवकूफ-सरल लूप चलाएगा जो कि के साथ जुड़ने sshऔर संलग्न करने की कोशिश करता रहता है screen। होस्ट या जो कुछ भी आप सामान्य रूप से अपने sshमंगलाचरण को कमांड-लाइन तर्क के रूप में पास करेंगे।
पुन: कनेक्ट बस इस बात पर आधारित है कि क्या SSH कनेक्शन के साथ कोई त्रुटि रिपोर्ट करता है, जिसका अर्थ है कि इसमें गैर-SSH त्रुटियों का पता लगाने के लिए कोई बुद्धिमत्ता नहीं है जैसे "आप का शाब्दिक रूप से WiFI चालू नहीं है" या जो भी हो, लेकिन वह संभवतः इसके लिए कोई मायने नहीं रखता है। आप।
मैं मान रहा हूँ कि आपके पास ssh-agentया एक नो-पासफ़्रेज़ SSH कुंजी है जो आपको अतिरिक्त इनपुट के बिना बस काम करने के लिए पुन: संयोजन की अनुमति देगा।
एक छोटी दौड़ की स्थिति होने जा रही है, जहां अगर आप ^Cएक पुन: कनेक्ट के दौरान बस दूसरे के सही मानव-अगोचर अंश के दौरान हिट ^Cकरते हैं, तो आप क्लाइंट टर्मिनल से गुजरने के बजाय स्क्रिप्ट को मार सकते हैं , इसलिए यदि आपको एक कनेक्शन लटका हुआ है। ^Cबहुत उत्साह से मैश न करें ।
सरलतम अतिरिक्त सॉफ्टवेयर समाधान
आप प्रोग्राम ऑटोस को आज़मा सकते हैं , जो आपके उबंटू पैकेज रिपॉजिटरी में उपलब्ध होना चाहिए।
यदि आपको स्रोत से निर्माण करने या इसे ऑडिट करने की आवश्यकता है, तो यह एक एकल सी प्रोग्राम है जो बिना किसी अतिरिक्त पुस्तकालयों के निर्भरता के रूप में संकलित करता है, लगता है कि मेरे हैक के मुकाबले कनेक्शन आजीविका की जाँच करने के बारे में अधिक बुद्धिमत्ता है, और यह एक सुविधाजनक rscreenस्क्रिप्ट कमांड के साथ भी काम करता है जो ऑटो -करना screen।
विवरण
कैसे sshसामान्य रूप से ठीक हो जाता है
बस सत्यापित करने के लिए, क्योंकि मुझे खुद को जांचे बिना चीजें कहना पसंद नहीं है, मैंने जवाब देने से पहले थोड़ा परीक्षण किया:
मैंने लिनक्स डिवाइस के साथ अपने वाईफाई पर प्रवेश किया, अपने लैन पर एक अन्य डिवाइस के लिए एसएसएच कनेक्शन बनाया, सत्यापित किया कि मेरे पास sshदूसरे छोर पर काम करने का कनेक्शन है (कमांड आदि चला सकता है), फिर क्लाइंट पर वाईफाई डिस्कनेक्ट कर दिया (इंटरफ़ेस के कारण) डी-कॉन्फ़िगर किया जाना: कोई और आईपी पते नहीं), ssh सत्र में एक अधिक वर्णों को टाइप किया (कोई प्रतिक्रिया नहीं, निश्चित रूप से), और फिर मेरे वाईफाई से पुन: कनेक्ट किया गया - खराब सिग्नल और अन्य कारकों के कारण कम से कम एक बार पुन: संयोजन विफल हो गया , फिर अंत में फिर से जुड़ गया: मैंने sshसत्र के ठीक होने में लगभग पांच सेकंड इंतजार किया , ऐसा कुछ नहीं हुआ जिससे मैंने एक और कुंजी को मारा, और sshसत्र तुरंत फिर से जीवित हो गया, सभी कुंजियों के साथ जो मैंने कमांड लाइन पर दिखाई देने वाले डिस्कनेक्ट के दौरान टाइप किया था।
देखें, sshबस टीसीपी नेटवर्क सॉकेट में लिखता है / पढ़ता है जब तक कि ओएस यह नहीं बताता कि कुछ गलत हुआ है, और टीसीपी वास्तव में लंबे समय तक कनेक्शन की बूंदों के प्रति बहुत सहिष्णु है।
डिफ़ॉल्ट कर्नेल सेटिंग्स के साथ अपने उपकरणों के लिए छोड़ दिया लिनक्स में टीसीपी स्टैक खुशी से कनेक्शन को मृत घोषित करने से पहले कई मिनटों के लिए पूरी तरह से चुपचाप सहन करेगा और एक त्रुटि की रिपोर्ट करेगा ssh- जब तक यह अंत में हम ballpark में बात कर रहे हैं ~ 30 मिनट का, या कम से कम निश्चित रूप से लंबे समय तक पर्याप्त है एक दूसरे या एक मिनट तक चलने वाली हिचकी।
कवर के नीचे, लिनक्स टीसीपी स्टैक धीरे-धीरे संदेशों को लंबे और लंबे समय तक देरी से हटाता है, हालांकि, जिसका अर्थ है कि जब तक आपका कनेक्शन वापस नहीं आता है, तब तक आप अपने sshसत्र को फिर से "जीवित" आने से पहले अतिरिक्त अंतराल देख रहे होंगे ।
यह कभी-कभी क्यों टूटता है
अक्सर कुछ सक्रिय रूप से उस कनेक्शन को बंद करने का कारण बनता है जो टीसीपी स्टैक को बर्दाश्त करने वाली राशि की तुलना में कुछ हद तक निष्क्रियता के बाद बंद हो जाएगा, और फिर उस कनेक्शन को अपने sshक्लाइंट को रिपोर्ट करने में विफल हो सकता है।
संभावित उम्मीदवारों में शामिल हैं:
फायरवॉल या नेटिंग राउटर, जिन्हें प्रत्येक लाइव टीसीपी कनेक्शन को याद रखने के लिए मेमोरी का उपयोग करना पड़ता है - एक अनुकूलन और डॉस हमलों के खिलाफ कुछ शमन के रूप में, वे कभी-कभी आपके कनेक्शन को भूल जाएंगे , और फिर चुपचाप इसके लिए परिणामी पैकेटों को अनदेखा करेंगे, क्योंकि पैकेट में एक कनेक्शन के बीच में जब आपको कनेक्शन याद नहीं है तो मौजूदा लुक अमान्य है।
बेहतर व्यवहार करने वाले फायरवॉल / राउटर एक टीसीपी आरएसटी पैकेट को इंजेक्ट करेंगे, जो आम तौर पर एक connection reset by peerत्रुटि संदेश के रूप में प्रकट होता है , लेकिन रीसेट पैकेट आग और भूल जाता है, इसलिए यदि आपके क्लाइंट का कनेक्शन अभी भी उस पल में समस्या हो रही है और गिरता है पैकेट रीसेट करें, आपके ग्राहक को लगेगा कि कनेक्शन अभी भी जीवित है।
सर्वर ही अपने ग्राहक संबंध जारी रखने के लिए कोशिश कर रखता है, लेकिन सर्वर ने सिर्फ यह है: एक फ़ायरवॉल नीति चुपचाप अप्रत्याशित पैकेट, जो ग्राहक के संबंध बहाली के प्रयास टूट जाएगा ड्रॉप करने के लिए जब भी सर्वर ने कनेक्शन बंद सोचता है लेकिन ग्राहक नहीं है हो सकता है इसे अनदेखा करना क्योंकि इन पैकेटों का सर्वर के फ़ायरवॉल स्थिति में कोई लाइव कनेक्शन नहीं है।
चूंकि आप लिनक्स चला रहे हैं, अपने सर्वर iptables/ ip6tables(या nftयदि आप नए सामान का उपयोग कर रहे हैं) को ध्यान से देखें कि क्या आप बनाम छोड़ने की अनुमति दे रहे हैं। यह अनुमति देने के लिए बहुत ही आम है नई / स्थापित / संबंधित टीसीपी SSH बंदरगाह पर पैकेट, लेकिन नहीं "अवैध" लोगों - आप चुपचाप सब कुछ है कि अनुमति नहीं है छोड़ने कर रहे हैं, यह आम सेटअप संक्षिप्त कनेक्शन समस्याओं के बाद फ्रीज़ इन प्रकार के कारण हो सकता है ।
टीसीपी या एसएसएच क्लाइंट कीपैलिव पैकेट के लिए ओपनएसएसएच विकल्पों में से एक का उपयोग करने के बाद, आपके एसएसएच सर्वर को निष्क्रियता की अवधि के बाद कनेक्शन बंद करने के लिए कॉन्फ़िगर किया जा सकता है। अपने आप से यह अनिश्चित हैंग का कारण नहीं होगा, लेकिन यह आपको ऊपर वर्णित राज्यों में से एक में डाल सकता है।
यह संभव है कि आप अपने राज्य में आने के बाद इसे "अनहंग" के लिए पर्याप्त समय नहीं दे रहे हों, जहां आपका sshसत्र लटका हुआ है।
<Enter>और~.कनेक्शन छोड़ने के लिए अपना पक्ष बताने के लिए टाइप करें, और आप बस फिर से कनेक्ट करने के लिए अंतिम ssh कमांड को दोहरा सकते हैं (जैसे कि अप-एरो के साथ!!)।