जब SSH कनेक्शन टूट जाता है तो कंसोल कभी-कभी क्यों लटकाते हैं?


89

मैंने इसे कई कंसोल (लिनक्स, मैक, ...) पर, और कई अलग-अलग मशीनों के साथ कई अलग-अलग नेटवर्क में देखा है। मैं कभी भी सटीक कारण नहीं बता सकता, ऐसा क्यों होता है: आपको बस इतना करना है कि SSH के माध्यम से एक मशीन में प्रवेश करें। यदि कनेक्शन किसी कारण से टूट जाता है (सादगी के लिए, मान लें कि नेटवर्क केबल खींच लिया गया था), तो कभी-कभी कंसोल बस हमेशा के लिए लटका रहता है - अन्य समय में, यह बस मूल शेल से ठीक बाहर निकलता है।

ऐसा होने पर बहुत गुस्सा आता है (जैसे कि आप कमांड हिस्ट्री खो देते हैं।) क्या कोई गुप्त कीबोर्ड शॉर्टकट है जो एक निकास (Ctrl-C या Ctrl-D काम नहीं करता है) को बाध्य कर सकता है? और इस यादृच्छिक "बग" के सभी कार्यान्वयनों के लिए वैसे भी क्या कारण है?


यह थ्रेड Mosh (मोबाइल शेल) का उल्लेख करने के लिए उपयुक्त लगता है जो कनेक्शन विफलताओं से अच्छी तरह से निपटता है, जिसमें रोमिंग (आईपी का परिवर्तन) और अन्य सामान शामिल हैं।
सिप्रियन टॉमोयागै

जवाबों:


137

बाहर निकलने के लिए मजबूर करने के लिए "गुप्त" कीबोर्ड शॉर्टकट है: ~) जमे हुए सत्र से, इन कुंजियों को क्रम में मारो: Enter~.टिल्ड (केवल एक नई रेखा के बाद) को ssh क्लाइंट द्वारा भागने के क्रम के रूप में पहचाना जाता है, और अवधि बताती है ग्राहक आगे की हलचल के बिना इसे समाप्त करने के लिए ग्राहक है।

संचार के मुद्दों पर लंबे समय से लटका व्यवहार एक बग नहीं है, एसएसएच सत्र लटका हुआ है उम्मीद है कि दूसरी तरफ वापस आ जाएगा। यदि नेटवर्क टूट जाता है, तो कभी-कभी दिन बाद भी आप SSH सत्र वापस पा सकते हैं। बेशक आप विशेष रूप से यह बता सकते हैं कि ऊपर दिए गए अनुक्रम के साथ छोड़ देना और मरना है। ऐसी कई चीजें हैं जो आप अपने क्लाइंट में की-लिवआउट टाइमआउट सेट करने के लिए कर सकते हैं ताकि अगर उसमें एक निश्चित समय के लिए सक्रिय लिंक न हो तो वह अपने आप बंद हो जाता है, लेकिन डिफ़ॉल्ट व्यवहार इस प्रकार रहना है संभव के रूप में जुड़ा हुआ है!

संपादित करें: इस रुकावट कुंजी का एक अन्य उपयोगी अनुप्रयोग स्थानीय ssh क्लाइंट का ध्यान आकर्षित करना है और इसे एक मिनट के लिए अपने स्थानीय शेल पर वापस लाने के लिए पृष्ठभूमि बनाना है- अपने इतिहास से कुछ पाने के लिए- फिर इसे दूर से काम करने के लिए भूमिगत रखें। Enter~ Ctrl+ Zअपने स्थानीय शेल की पृष्ठभूमि नौकरी कतार में ssh क्लाइंट को भेजने के लिए, फिर fgइसे वापस पाने के लिए सामान्य रूप से।

संपादित करें: जब नेस्टेड एसएसएच सत्रों के साथ काम करते हैं, तो आप श्रृंखला में एसएसएच सत्रों में से केवल एक को तोड़ने के लिए कई टिल्ड वर्ण जोड़ सकते हैं, लेकिन दूसरों को बनाए रख सकते हैं। उदाहरण के लिए, यदि आप 3 स्तरों में नेस्टेड हैं, (यानी आप लोकल-> मशीन 1-> मशीन 2-> मशीन 3) से हैं, Enter~.तो आपको अपने स्थानीय सत्र में वापस मिल Enter~~.जाएगा, Enter~~~.आपको मशीन 1 में छोड़ देगा , और आपको मशीन 2 में छोड़ देगा। । यह अन्य एस्केप अनुक्रमों के लिए भी काम करता है, जैसे कि ssh सत्र को अस्थायी रूप से पृष्ठभूमि पर ले जाना। उपरोक्त किसी भी स्तर के घोंसले के लिए काम करता है, बस अधिक टिल्ड को जोड़कर।

अंत में, आप Enter~?उपलब्ध एस्केप कमांड के हेल्प मेनू को प्रिंट करने के लिए उपयोग कर सकते हैं ।

TL; DR - समर्थित एस्केप कमांड सपोर्टेड एस्केप सीक्वेंस हैं:

 ~.   - terminate connection (and any multiplexed sessions)
 ~B   - send a BREAK to the remote system
 ~C   - open a command line
 ~R   - request rekey
 ~V/v - decrease/increase verbosity (LogLevel)
 ~^Z  - suspend ssh
 ~#   - list forwarded connections
 ~&   - background ssh (when waiting for connections to terminate)
 ~?   - this message
 ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

11
सिर में sshd की शूटिंग के लिए dodecatouple-secret-probation पासवर्ड जानने के लिए +1। क्या आपने इसके बारे में उसी तरह से पता किया जो मैंने किया था (एंट्री ~/.somethingorotherमारने के बाद गलत तरीके से )?
voretaq7

2
@ voretaq7: नहीं, मैं उस स्मार्ट नहीं था, लेकिन जब किसी ने मुझे सुराग दिया तो मैं चला गया "वास्तव में? तो क्या यही सब कुछ हो रहा था जब मेरा शेल बस बैंग गया था? बिना किसी कारण के जब मैं टाइप कर रहा था?" । यह एक सामान्य अनुक्रम नहीं है सिवाय आपके द्वारा उल्लेख किए हुए के गलतियों में, लेकिन ऐसा हो सकता है।
कालेब

14
जिससे "गुप्त" का अर्थ है "पुरुष पृष्ठ में"।
लार्क्स

4
जबकि कई लोग इस बारे में नहीं जानते हैं, यह वास्तव में सादे दृश्य में एक रहस्य है। man sshइसे ESCAPE CHARACTERSअनुभाग के अंतर्गत शामिल किया गया है । ~.(डिस्कनेक्ट) और ~^Z(पृष्ठभूमि ssh) बहुत काम कर रहे हैं।
स्टीफन लासिवस्की

9
बेशक यह मैन पेज में है :) मैंने केवल गुप्त शब्द का उपयोग किया क्योंकि ओपी ने किया था, और मैं गाल में जीभ का उपयोग कर रहा था। इस विशेषता के साथ समस्या यह है कि लोगों को यह नहीं पता है कि इसे कहां देखना है, वे नियंत्रण वर्ण और ऐसे संकेतों की अपेक्षा करते हैं जो शेल या इस तरह का हिस्सा हों। एक बार जब आप जानते हैं कि कहां देखना है या क्या पूछना है, तो निश्चित रूप से यह वहां है।
कालेब

12

SSH एक जीवित रखने की सुविधा प्रदान करता है। अपने स्थानीय में निम्नलिखित जोड़ें ~/.ssh/config(यदि यह मौजूद नहीं है तो बनाएं):

ServerAliveInterval 15
ServerAliveCount 3

यह सेटिंग सुरक्षित सुरंग के माध्यम से हर 15 सेकंड में भेजे जाने वाले एक जीवित-संकेत को स्थापित करेगा। लगातार तीन विफलताओं के बाद, SSH क्लाइंट बाहर निकल जाएगा।

ध्यान दें कि कुछ प्रणालियों पर (macOS 10.14 सहित) इसके बजाय इसकी आवश्यकता है:

ServerAliveInterval 15
ServerAliveCountMax 3

पूछने पर इस उत्तर से लिया गया ।ubuntu: https://askubuntu.com/a/29967/30266


9

यह तथ्य कि यह लटका हुआ है, टीसीपी का कार्य है, एसएसएच का नहीं। एप्लिकेशन के पास यह जानने का कोई तरीका नहीं है कि टीसीपी सत्र / कनेक्शन विच्छेद कर दिया गया है जब तक कि टीसीपी कनेक्शन का उपयोग करके आवेदन को सूचित नहीं करता है कि कनेक्शन मौजूद नहीं है। प्रत्येक मेजबान के नजरिए से, टीसीपी सत्र अभी भी स्थापित स्थिति में है और यह कहने के लिए कुछ भी नहीं है कि एक लंबी निष्क्रिय (कोई डेटा प्रवाह नहीं) सत्र एक आरएसटी या टीसीपी कीपोरेटिव पैकेट की प्रतिक्रिया की कमी के अलावा अन्य मान्य नहीं है ( सार्वभौमिक रूप से लागू नहीं होता है)। यह मेरे लिए SSH में एक बग प्रतीत नहीं होता है, मैं उस व्यवहार की अपेक्षा करता हूं।


5

यदि कनेक्शन ठीक से लटका हुआ है तो किसी भी जादू कीस्ट्रोके के माध्यम से नहीं मिलेगा क्योंकि कुंजी दबाने से पहले ही कनेक्शन लटका दिया गया है। आप क्लाइंट को समाप्त करने के लिए कह सकते हैं लेकिन यह सर्वर के अंत में रखे गए इतिहास (या नहीं) को प्रभावित नहीं करेगा।

हालांकि यह वास्तव में इस सवाल का जवाब नहीं देता है कि यह कनेक्शन हैंग के प्रभाव को कम करने में मदद कर सकता है: जब मैं दूरस्थ रूप से काम कर रहा होता हूं (और आमतौर पर तब भी जब मैं नहीं होता) मैं अपनी उपलब्धता के आधार पर रैपर के screenसाथ (या उसके बिना ) दौड़ता हूं byobuताकि यदि किसी प्रकार का कनेक्शन मेरे सत्र को छोड़ दे, तो उसके पूरे इतिहास के साथ, संरक्षित और राज्य में उपलब्ध है जब मैंने पुन: कनेक्ट किया तो मैंने इसे छोड़ दिया।


6
स्क्रीन के बारे में आपका सुझाव ठीक है, लेकिन पहला बिट वास्तव में मुद्दे पर लागू नहीं है। आपको दूरस्थ पक्ष के माध्यम से कुंजी प्राप्त करने की आवश्यकता नहीं है, आपको केवल उन्हें LOCAL ssh क्लाइंट के माध्यम से प्राप्त करना होगा! ओपी इतिहास सहित अपने स्थानीय खोल को वापस चाहता है। SSH इसे लेता है और CTRL-C जैसे सामान्य ब्रेक अनुक्रमों का जवाब नहीं देता क्योंकि यह उन पर गुजरता है। स्थानीय क्लाइंट के माध्यम से प्राप्त करने और समाप्त करने का एक तरीका है, मेरा उत्तर देखें। स्थानीय अंत पर इतिहास आमतौर पर वैसे भी रखा जाता है यदि आप शेल कॉन्फ़िगरेशन के आधार पर फिर से लॉगिन करते हैं।
कालेब

2
@ कालेब: प्रश्न विशेष रूप से इतिहास को खोने का उल्लेख किया गया है, और कमांड इतिहास संग्रहीत सर्वर-साइड है। सर्वर को इतिहास के साथ कुछ अलग करने के लिए कहने के लिए आपको सर्वर को संदेश प्राप्त करने की आवश्यकता है ताकि वह इतिहास के साथ कुछ अलग कर सके। बेशक, बैश (और कुछ अन्य गोले) बनाने के तरीके हैं इतिहास की पंक्तियों को तुरंत रैम में इकट्ठा करने के बजाय रिकॉर्ड करें जब तक कि उपयोगकर्ता ठीक से शेल के साथ मौजूद नहीं होता है exit/ logoutजो उपयोग किए बिना इतिहास के मुद्दे को हल करेगा screen
डेविड स्पिललेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.