सवाल एसएसएच कनेक्शन टूटने पर कंसोल कभी-कभी क्यों लटकाते हैं?


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

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


74
2018-06-22 18:12


मूल


यह धागा उल्लेख करने के लिए उपयुक्त लगता है mosh (मोबाइल शैल) जो रोमिंग (आईपी में परिवर्तन) और अन्य सामान सहित कनेक्शन विफलताओं के साथ अच्छी तरह से संबंधित है। - Ciprian Tomoiagă


जवाब:


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

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

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

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

अंत में, आप इसका उपयोग कर सकते हैं दर्ज~? उपलब्ध बचने के आदेशों के एक सहायता मेनू मुद्रित करने के लिए।

टीएल; डीआर - समर्थित बचने के आदेश हैं समर्थित भागने के दृश्य:

 ~.   - 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.)

121
2018-06-22 18:15



सिर में sshd शूटिंग के लिए dodecatouple-secret-probation पासवर्ड जानने के लिए +1। क्या आपने इसके बारे में पता लगाया जैसा मैंने किया था (गलत टाइपिंग ~/.somethingorother प्रवेश मारने के बाद)? - voretaq7
@ voretaq7: नहीं, मैं वह स्मार्ट नहीं था, लेकिन जब किसी ने मुझे देखा तो मैं गया "वास्तव में? तो यही वह समय हो रहा था जब मेरा खोल सिर्फ बैंग चला गया! किसी भी कारण से जब मैं टाइप कर रहा था?"। आपके द्वारा उल्लेख किए गए किसी भी प्रकार की त्रुटियों को छोड़कर यह एक सामान्य अनुक्रम नहीं है, लेकिन ऐसा हो सकता है। - Caleb
जिससे "गुप्त" का अर्थ है "मैन पेज में"। - larsks
जबकि बहुत से लोग इस बारे में नहीं जानते हैं, यह वास्तव में सादे दृश्य में एक रहस्य है। man ssh इसके तहत कवर करता है ESCAPE CHARACTERS अनुभाग। ~. (डिस्कनेक्ट) और ~^Z (पृष्ठभूमि एसएसएच) बहुत आसान हैं। - Stefan Lasiewski
बेशक यह मैन पेज में है :) मैंने केवल गुप्त शब्द का इस्तेमाल किया क्योंकि ओपी ने किया था, और मैं गाल में जीभ का उपयोग कर रहा था। इस सुविधा के साथ समस्या यह है कि लोगों को यह नहीं पता कि यह कहां देखना है, वे नियंत्रण पात्रों और ऐसे संकेतों को शैल या इस तरह का हिस्सा होने की उम्मीद करते हैं। एक बार जब आप जानते हैं कि कहां देखना है या यहां तक ​​कि क्या पूछना है, निश्चित रूप से यह वहां है। - Caleb


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

ServerAliveInterval 15
ServerAliveCount 3

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

ध्यान दें कि कुछ प्रणालियों पर इसके बजाय यह होना चाहिए:

ServerAliveInterval 15
ServerAliveCountMax 3

Ask.ubuntu पर इस जवाब से लिया गया: https://askubuntu.com/a/29967/30266


10
2018-01-19 08:44





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


8
2018-06-22 19:49





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

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


5
2018-06-22 18:18



स्क्रीन के बारे में आपका सुझाव ठीक है, लेकिन पहली बात वास्तव में इस मुद्दे पर लागू नहीं है। आपको रिमोट साइड के माध्यम से चाबियाँ प्राप्त करने की आवश्यकता नहीं है, आपको केवल उन्हें स्थानीय एसएसएच क्लाइंट के माध्यम से ले जाना होगा! ओपी इतिहास सहित अपने स्थानीय खोल वापस चाहता है। एसएसएच इसे लेता है और सामान्य ब्रेक अनुक्रमों जैसे CTRL-C का जवाब नहीं देता है क्योंकि यह उन पर गुजरता है। स्थानीय क्लाइंट को पाने और समाप्त करने का एक तरीका है, मेरा जवाब देखें। शेल कॉन्फ़िगरेशन के आधार पर, स्थानीय अंत में इतिहास आमतौर पर तब भी रखा जाता है जब आप दोबारा लॉगिन करते हैं। - Caleb
@ कैलेब: प्रश्न विशेष रूप से इतिहास खोने का उल्लेख किया गया है, और कमांड इतिहास सर्वर-पक्ष संग्रहीत है। सर्वर को इतिहास के साथ कुछ भी अलग करने के लिए कहने के लिए आपको सर्वर से संदेश प्राप्त करने की आवश्यकता है ताकि वह इतिहास के साथ कुछ अलग करने के लिए कह सके। निश्चित रूप से बैश (और कुछ अन्य गोले) रिकॉर्ड इतिहास लाइनों को रैम में इकट्ठा करने के बजाय, जब तक कि उपयोगकर्ता ठीक से खोल नहीं लेता है, exit/logout जो उपयोग किए बिना इतिहास के मुद्दे को हल करेगा screen। - David Spillett