टूटे हुए पाइप के बाद मैं ssh सत्र को कैसे पुन: कनेक्ट कर सकता हूं?


28

इसलिए मैं apt-get upgradeएक सर्वर पर चल रहा था जब राउटर ने फैसला किया कि यह बहुत लंबा हो गया था क्योंकि यह आखिरी बार मुझे गुस्सा दिलाता था: इसने सभी कनेक्शन को गिरा दिया। screenजब आप चूतड़ पर होते हैं तो कहानी का नैतिक उपयोग बहुत होता है।

वैसे भी, मैंने वापस लॉग इन किया और htop में पाया कि प्रक्रिया अभी भी वहीं लटकी हुई थी, अभी भी मेरे Y / n के अपग्रेड होने का इंतजार कर रही थी (इसे अभी तक नहीं मिला, सौभाग्य से)। क्या ऐसा कोई तरीका है जिससे मैं एक सत्र को समाप्त कर सकता हूं जिसे तोड़ दिया गया था? मैंने इसे समाप्त कर दिया क्योंकि यह पैकेज प्रबंधन के बीच में नहीं था, लेकिन भविष्य के संदर्भ के लिए यह जानना बहुत अच्छा होगा।


1
मुझे आश्चर्य है कि apt-getप्रक्रिया अभी भी चल रही थी। यह SSH तक की पूरी प्रक्रिया श्रृंखला के साथ मर जाना चाहिए था। मैंने देखा है कि do-dist-upgradeस्वचालित रूप से screen/ byobuसत्र में शुरू होता है : शायद कुछ परिस्थितियों में, apt-getवही करता है?
nfirvine

जवाबों:


16

आपके उचित प्रश्न का उत्तर है: आप नहीं कर सकते । मुझे लगता है कि मुख्य समस्या यह है कि प्रमाणीकरण प्रक्रिया सिंक से बाहर हो जाएगी। इट जस्ट डोंट वर्क वर्क लाइक दैट।

जैसा कि आपने खुद देखा है, समाधान संभव हो तो स्क्रीन का उपयोग करना है (वैसे, tmux स्क्रीन का एक विकल्प है)।


1
लेकिन अगर आपके पास पासवर्ड रहित ssh है तो क्या होगा? क्या आप इसे कर सकते हैं?
श्रीधर सरनोबत

1
byobuएक अच्छा, सामने वाले छोर screen(या tmux) का उपयोग करना आसान है - निश्चित रूप से देखने लायक है (:
drevicko

श्रीधर-समबोल, प्रमाणीकरण अभी भी लेने की आवश्यकता है। एक रनिंग सत्र में शामिल होने के लिए शुरुआती हैंडशेक को फिर से करने का कोई तरीका नहीं है, इसलिए यदि हम एक नए सत्र को मौजूदा में पेश करते हैं तो यह अपरिवर्तित हो जाएगा। उत्तर: नहीं।
केवआर

9

लंबे समय तक चलने वाली प्रक्रियाओं के लिए, मैं स्क्रीन का उपयोग करता हूं , या यदि आप एक अधिक अनुकूल इंटरफेस चाहते हैं तो बायोबू

स्क्रीन के लिए, आप उपयोग कर सकते हैं:

screen [program] [args]

यह एक स्क्रीन सत्र के अंदर [प्रोग्राम] और इसके [args] चलेगा । एक बार कार्यक्रम समाप्त होने के बाद, सत्र स्वतः बंद हो जाता है। यदि आप अपने कार्यक्रम को चलाने के बाद सत्र रखना चाहते हैं, तो बस बिना किसी तर्क के स्क्रीन चलाएं और सत्र के अंदर एक नया संकेत दिखाई देगा। CTRL + A + D वर्तमान सत्र से टर्मिनल को अलग करता है।

पिछले सत्र में फिर से संलग्न करने के लिए:

screen -r

यदि केवल एक सत्र खुला है, तो यह तुरंत रीटैक करेगा। यदि कई सत्र चल रहे हैं, तो यह आपसे पूछेगा कि आप किसे संलग्न करना चाहते हैं। यदि आप सत्र का नाम जानते हैं, तो आप इसे इस कमांड लाइन के तर्क के रूप में जोड़ सकते हैं।

बायोबू एक अच्छा सुधार है। यह स्क्रीन पर आधारित है , लेकिन नीचे एक बार प्रदान करता है जो सभी मौजूदा सत्रों को टैब के रूप में दिखाता है और उन लोगों के चारों ओर जाने के लिए आसान शॉर्टकट देता है। आप ऐसा कर सकते हैं:

  • F2 एक नया सत्र शुरू करें
  • F3 बाईं ओर अगले सत्र टैब पर जाएं
  • F4 दाईं ओर अगले सत्र टैब पर जाएं
  • F8 वर्तमान सत्र टैब के लिए एक अनुकूल नाम देता है
  • F9 एक विकल्प मेनू खोलता है
  • CTRL + A + D टर्मिनल से सभी सत्रों को अलग करता है।

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


1
क्या मैं ओपी को उद्धृत कर सकता हूं: "कहानी का नैतिक स्क्रीन का उपयोग करना है "। जाहिर है कि यहाँ सवाल नहीं था।
जनवरी

राइटअप के लिए धन्यवाद लेकिन जनवरी सही था।

स्क्रीन को रूट के रूप में सेट करने के लिए sudo स्क्रीन <कमांड> का उपयोग करें, जिसे इसे फिर से कनेक्ट करने के लिए sudo एक्सेस की आवश्यकता होती है। सामान्य रूप से स्क्रीन शुरू करने से बेहतर है, फिर उसके भीतर रूट में बदलना।
djsmiley2k - CoW

8

जब आप एक टूटे हुए SSH सत्र को पुनः प्राप्त नहीं कर सकते हैं, तो आप SSH के अंदर चल रही प्रक्रिया को पुन: प्राप्त कर सकते हैं - कार्यात्मक रूप से जो हम चाहते हैं उसके बराबर।

अनुदेश

आपके मामले में, आप apt-getएक नए एसएसएच सत्र, screenसत्र या इस तरह से नियंत्रित होने की प्रक्रिया को संभाल लेंगे । इसके लिए मेरा पसंदीदा reptyrआदेश है:

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

फिर, आप अपनी प्रक्रिया के लिए पाई गई पिड के साथ:

$ sudo reptyr -T 10626

या अगर वह काम नहीं करता है, तो कोशिश करें:

$ reptyr 10626

इस चरण के बाद, आपका सारा कीबोर्ड इनपुट आपके द्वारा लिए गए प्रोग्राम में चला जाता है। दुर्भाग्य से आप SSH सत्र का पुराना आउटपुट नहीं देखेंगे, जैसे कि apt-getआउटपुट आपसे पुष्टिकरण के लिए पूछ रहा है।

स्पष्टीकरण

कई अन्य उपकरण हैं जो मूल रूप से reptyr( ptraceडिबग अनुलग्नक के माध्यम से ) के समान काम करते हैं । निम्नलिखित प्रश्नों और उत्तरों को देखें जहाँ उनकी चर्चा की गई है:

उपरोक्त निर्देशों में, डीबग अटैचमेंट reptyr 10626का उपयोग करता है ptraceजबकि sudo reptyr -T 10626कमांड TTY चोरी का उपयोग करता है और बेहतर ( विवरण ) है।

अंत में, कारण है कि आप इस तरह से SSH सत्र नहीं ले सकते, क्योंकि एक sshdप्रक्रिया को एक होस्ट टर्मिनल द्वारा नियंत्रित नहीं किया जाता है, इसके बजाय यह एक टर्मिनल का गुलाम हिस्सा प्रदान करता है - एक ptsउपकरण - जबकि मास्टर हिस्सा इसे नियंत्रित करता है। ग्राहक मशीन, यहाँ बीच में टूटे हुए SSH सत्र के साथ। जब आप इस तरह की sshdप्रक्रिया को लागू करने के लिए बाध्य करते हैं reptyr -s <pid>, तो आपका कीबोर्ड इनपुट उस प्रक्रिया में जाता है, न कि इसकी सक्रिय बाल प्रक्रिया। तो एक "Ctrl + Z" बस उसे मार देगा sshd


1

मैं do-dist-upgradeएक लैपटॉप से ​​ssh के माध्यम से कर रहा था जो सस्पेंड हो गया था, इसलिए Broken pipe। मशीन में वापस जाने पर मैं अपग्रेड से संबंधित प्रक्रियाओं को अभी भी देख रहा था, जिसमें से whiptailमुझे इनपुट के लिए पूछ रहा था (जो चुनने के लिए प्रबंधक प्रदर्शित करता है) और, प्रासंगिक रूप से, एक रूट-स्वामित्व SCREEN। मैं ऐसा करने में सक्षम था sudo su -और screen -rसत्र और, लो और निहारना करने के लिए संलग्न करने के लिए, मैं इनपुट लेने में सक्षम मेरे सामने whiptail संवाद है। मैं मूल रूप से उन्नयन को फिर से शुरू करने में सक्षम था।

नोट: यह Ubuntu 14.04 से 16.04 तक का अपग्रेड था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.