सवाल एसएसएच कनेक्शन पर "असफल लिखें: टूटी हुई पाइप" को कैसे रोकें?


रोकने के लिए क्लाइंट और सर्वर दोनों पर एसएसएच को कॉन्फ़िगर करने के लिए मैं क्या कर सकता हूं Write Failed: broken pipe त्रुटियों? यह अक्सर होता है यदि आप अपने क्लाइंट कंप्यूटर को सोते हैं और बाद में फिर से शुरू करते हैं।


232
2018-04-28 23:36


मूल


कुछ भी सच नहीं। सत्र में बाधा डाली गई, और सत्र की सुरक्षा से समझौता किया गया। यदि आप कंप को नींद नहीं डालते हैं तो आप क्लाइंट के लिए जीवित दिल की धड़कन को शूट करने के लिए जीवित समय निर्धारित कर सकते हैं, लेकिन अगर सिस्टम सो रहा है तो ऐसा कुछ भी नहीं किया जा सकता है। - darkdragn
इस मामले में मैं ऐसा कुछ ढूंढ रहा हूं जो मुझे टूटे हुए एसएसएच कनेक्शन (संभवतः बाहर निकलने वाले कोड पर आधारित) को फिर से शुरू करने की अनुमति दे और उपयोग को बहाल करे screen? - sorin
आप लोग गलत हैं: मेरे पास एक ही सर्वर से कनेक्ट होने वाली दो डेस्कटॉप क्लाइंट मशीनें हैं। एक उबंटू 12.10 है, क्वांटल, जिसका एसएसएच क्लाइंट अच्छी तरह से काम करता है, और कनेक्शन को घंटों तक रखता है। दूसरा उबंटू 14.10, यूटोपिक है, बस एक तरफ और एक ताजा इंस्टॉलेशन में; कुछ मिनटों के बाद, यह इस संदेश के साथ खुद को ब्लॉक करता है। मशीन में शेष नेटवर्क फ़ंक्शंस बाधित नहीं होते हैं। तो नहीं, यह न तो नेटवर्क समस्या है, न ही एक सर्वर समस्या है, लेकिन एक विशिष्ट एसएसएच क्लाइंट सॉफ्टवेयर समस्या है, जिसे हल किया जा सकता है, "अंधेरे ड्रैगन" के विपरीत क्या कहने की हिम्मत है कि "कुछ भी नहीं किया जा सकता"। - David L
और वास्तव में, जैसा कि मैंने कहा था: जब लोग कहते हैं कि "कुछ नहीं किया जा सकता", तो लोग बहुत ज्यादा बात करते हैं, जैसे कि @ डार्कड्रगन ने डर दिया। मैंने अराम कोचर्यन के जवाब को पढ़ा, और मैंने इसे लागू किया: 20 मिनट पहले ... मुझे एहसास हुआ कि मेरे पुराने क्वांटल उबंटू 12.10 में, मैंने दो साल पहले उस फाइल में उस निर्देश को लागू किया था [मैंने अभी जांच की], और वह था वहां स्थिरता का कारण है। मैंने इसे यहां किया, और पिछले 20 मिनट में, कनेक्शन तब से स्थिर रहा है। तो कृपया, लोग: यह सोचने के लिए साहसी होने पर खुद को रोकें कि "कुछ नहीं किया जा सकता", और उस संदेश को अन्य लोगों को छोड़ने की कोशिश करते समय और भी बचना चाहिए। - David L
@ डेविडड आपको रेंटिंग से पहले बेहतर प्रश्नों को पढ़ना चाहिए। आपकी समस्या ओपी के समान नहीं है, जो स्पष्ट रूप से कंप्यूटर को सोने के लिए उल्लेख करती है। जिस तरह से केवल उत्तर पते में से एक ("mosh"), और इसे प्रश्न के 2 साल बाद पोस्ट किया गया था। हालांकि अन्य उत्तर अगली सबसे अच्छी चीज करते हैं, जो उन मामलों के समाधान का प्रस्ताव दे रहा है जिन्हें आपके जैसे आसानी से सुलझाया जा सकता है। शांत हो जाओ, इतना तनाव न करें, ranting यहाँ चारों ओर कोई अच्छा नहीं करता है ... - msb


जवाब:


मैंने इसमें कोशिश की है /etc/ssh/ssh_config लिनक्स और मैक के लिए:

Host *
ServerAliveInterval 120

यह कितनी बार, सेकंड में, इसे सर्वर पर एक रखरखाव संदेश भेजना चाहिए। यदि यह काम नहीं करता है तो काम करने के दौरान हर दो मिनट में प्रवेश करने के लिए एक बंदर को प्रशिक्षित करें।

आप या तो सेट कर सकते हैं ServerAliveInterval में /etc/ssh/ssh_config ग्राहक मशीन या के ClientAliveInterval में /etc/ssh/sshd_config सर्वर मशीन का। अगर आपको अभी भी त्रुटि मिल रही है तो अंतराल को कम करने का प्रयास करें।

एक उपयोगकर्ता के लिए कॉन्फ़िगरेशन फ़ाइल में सेट किया जा सकता है ~/.ssh/config सर्वर और क्लाइंट पक्ष दोनों पर। सुनिश्चित करें कि फ़ाइल में सही अनुमतियां हैं chmod 644 ~/.ssh/config


211
2018-05-26 11:49



हाँ मैं वही करता हूं और यह ज्यादातर चीजों के लिए काफी अच्छा काम करता है। - Oli♦
मैं मैक पर नहीं हूं, लेकिन उबंटू 12.04 और इस ऑपरेटिंग सिस्टम के लिए फ़ाइल ~ / .ssh / config भी प्रतीत होती है। - H2ONaCl
ओएस एक्स 10.8.4 एक त्रुटि देता है Bad configuration option: ClientAliveInterval - ohho
मुझे वही मिलता है Bad configuration option ओएसएक्स 10.8.4 पर त्रुटि। - Nick Heiner
आम तौर पर, आप इन दो आदेशों को सिस्टम के विभिन्न हिस्सों में डाल देते हैं। ओएसएक्स क्लाइंट पक्ष पर केवल ServerAliveInterval ... और sshd config फ़ाइल पर केवल क्लाइंटअलीवइंटरवाल ... - ftrotter


एसएसएच सत्र कई और संभावित रूप से अपरिहार्य कारणों से टूट सकता है।

एक उपयोगी उपयोगिता जिसे इसके कारण होने वाली समस्याओं को कम करने के लिए उपयोग किया जा सकता है screen। स्क्रीन एक शक्तिशाली उपयोगिता है जो आपको कई टर्मिनलों को नियंत्रित करने की अनुमति देती है जो एसएसएच सत्र से स्वतंत्र रूप से जीवित रहेंगे। उदाहरण के लिए, यदि आप भागते हैं screen एक एसएसएच सत्र में आप एक नया टर्मिनल खोलेंगे और आप नौकरियों को चलाने के लिए इसका उपयोग कर सकते हैं। आइए कहें कि आपका एसएसएच सत्र प्रक्रिया में मर जाता है। चल रहा है screen -d फिर screen -r अंतिम सत्र फिर से खोलेंगे और आप वहां से जारी रह सकेंगे। सुनिश्चित करें कि आप पढ़ते हैं कुछ दस्तावेज इसका उपयोग करने से पहले।


70
2017-10-04 16:28



यह शायद सबसे अच्छा जवाब है, मुझे यकीन नहीं है कि इसे उच्च वोट क्यों नहीं दिया गया है। अन्य "फिक्स" विशेष मामले में सहायक होते हैं जहां आप वास्तव में एक एसएसएच कनेक्शन बनाए रखने की परवाह करेंगे, लेकिन अधिकांश उपयोग मामलों में मुझे लगता है कि वास्तविक चिंता यह है कि किसी भी ग्राहक / सर्वर कनेक्शन के मुद्दों के बावजूद इच्छित प्रक्रियाएं चलती रहती हैं । - Paul McMurdie
मैं भी जोड़ूंगा Tmux स्क्रीन के विकल्प के रूप में। मुझे स्क्रीन से अधिक बहुमुखी और स्थिर लगता है। - fridaymeetssunday
भविष्य में संदर्भ के लिए इसे यहां छोड़कर - आप आसानी से चल सकते हैं screen -d -r अपने अंतिम सत्र को पुनर्प्राप्त करने के लिए। - doplumi
या केवल screen -dr। या screen -x आप जो करने की योजना बना रहे हैं उसके आधार पर। मुद्दा यह है कि, उन्हें यह जानना चाहिए कि वे सभी स्विच क्या करते हैं, ताकि कोई उपयुक्त लोगों का उपयोग कर सके और न केवल इंटरनेट लोगों के सुझावों का पालन कर सके। यहां एक अच्छा कॉम्पैक्ट सारांश उपलब्ध है: ss64.com/bash/screen.html - flith


ग्राहक विन्यास

फ़ाइल बनाने का प्रयास करें:

~/.ssh/config

सामग्री जोड़ें:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

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

यदि सर्वर के पिछले 30 सेकंड (जैसा ऊपर निर्दिष्ट है) में कोई पैकेट प्राप्त नहीं हुआ है, तो यह सर्वर पर एक हैलो-यू-यू-सिग्नल भेज देगा। हालांकि, अगर लगातार हैलो-हैं-आप-सिग्नल की संख्या ServerAliveCountMax तक पहुंच जाती है तो एसएसएच सर्वर से डिस्कनेक्ट हो जाएगा। यह मान 3 के लिए डिफ़ॉल्ट है (इसलिए सर्वर गतिविधि के बिना 3 * 30 = 9 0 सेकंड), अगर यह आपकी आवश्यकताओं के अनुरूप हो तो इसे बढ़ाएं। .Ssh / config फ़ाइल में बहुत अधिक कॉन्फ़िगरेशन विकल्प हैं और आप पढ़ सकते हैं:

एक एसएसएच कॉन्फ़िगर फ़ाइल का उपयोग करना

अन्य विकल्पों के बारे में अधिक जानकारी के लिए। आप इसे अपने द्वारा कनेक्ट किए जाने वाले प्रत्येक सर्वर पर लागू नहीं करना चाहते हैं, जिससे यह उदाहरण होगा। या लाइन को बदलकर इसे केवल एक विशेष सर्वर पर रोक दें Host * साथ में Host <IP> (एक आईपी पते से प्रतिस्थापित करें, ssh_config मैन पेज देखें)।

सर्वर विन्यास

इसी प्रकार आप सर्वर को अपने ग्राहकों के साथ सौम्य होने के लिए कह सकते हैं। विन्यास फाइल है /etc/ssh/sshd_config

ClientAliveInterval 20
ClientAliveCountMax 5

आप सेटिंग करके इसे निष्क्रिय कर सकते हैं ClientAliveInterval सेवा मेरे 0 या चिमटा ClientAliveInterval तथा ClientAliveCountMax जांच के जवाब दिए बिना अधिकतम एसएसएच क्लाइंट निष्क्रियता सेट करने के लिए। TCPKeepAlive पर इस सेटिंग का एक लाभ यह है कि सिग्नल एन्क्रिप्टेड चैनलों के माध्यम से भेजे जाते हैं, इसलिए यह कमजोर होने की संभावना कम होती है।


40
2017-10-06 02:54



यह काम नहीं करता है। मुझे एक ही त्रुटि का सामना करना पड़ रहा है। - user997704
इसे सीधे कमांड लाइन से आज़माएं और निम्न पर जाएं: ssh -o ServerAliveInterval = 5 उपयोगकर्ता @ होस्ट - Matt
कोशिश की कि वह भी काम नहीं करता है। मैं वास्तव में नहीं जानता कि मेरे सिस्टम के साथ क्या चल रहा है - user997704
यह ClientAliveCountMax है, क्लाइंटअलीवमैक्सकाउंट नहीं - David G
@ डेविड जी कृपया अपने सुधारों के साथ जवाब संपादित करें। - CivMeierFan


मैं एक उबंटू सर्वर को दूरस्थ रूप से सटीक से अपग्रेड कर रहा हूं और संदेश के साथ अपग्रेड के बीच में एसएसएच कनेक्शन खो गया हूं "लिखें विफल। ब्रॉकन पाइप"। ClientAliveInterval और ServerAliveInterval कुछ भी नहीं किया। समाधान क्लाइंट एसएसएच में TCPKeepAlive विकल्पों को चालू करना है:

TCPKeepAlive yes

में

/etc/ssh/ssh_config

22
2017-10-07 18:40





ग्राहक के लिए, अपना संपादित करें ~/.ssh/config (या /etc/ssh/ssh_config) फ़ाइल का पालन करें:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - निर्दिष्ट करता है कि सिस्टम को टीसीपी रखरखाव भेजना चाहिए या नहीं   दूसरी ओर संदेश। अगर वे भेजे जाते हैं, तो कनेक्शन की मौत   या मशीनों में से एक का दुर्घटना ठीक से देखा जाएगा। तथापि,   इसका मतलब है कि यदि मार्ग अस्थायी रूप से नीचे है तो कनेक्शन मर जाएगा,   और कुछ लोगों को यह परेशान लगता है (डिफ़ॉल्ट 'हां' है)।

ServerAliveInterval - उसके बाद सेकंड में एक टाइमआउट अंतराल सेट करता है   यदि सर्वर से कोई डेटा प्राप्त नहीं हुआ है, तो ssh (1) एक भेज देगा   एन्क्रिप्टेड चैनल के माध्यम से प्रतिक्रिया का अनुरोध करने के लिए संदेश   सर्वर। डिफ़ॉल्ट 0 है, यह दर्शाता है कि ये संदेश नहीं होंगे   सर्वर को भेजा गया।


सर्वर के लिए, अपना संपादित करें /etc/ssh/sshd_config जैसा:

ClientAliveInterval 600
ClientAliveCountMax 0

यदि आप एसएसएच क्लाइंट को 10 मिनट (600 सेकंड) के बाद स्वचालित रूप से बाहर निकलने के लिए (टाइमआउट) चाहते हैं।

ClientAliveCountMax - यह चेकलीव की कुल संख्या इंगित करता है   एसएसएच सर्वर द्वारा भेजा गया संदेश बिना किसी प्रतिक्रिया के   एसएसएच ग्राहक डिफ़ॉल्ट 3 है।

ClientAliveInterval - यह सेकंड में टाइमआउट इंगित करता है। एक्स के बाद   सेकंड की संख्या, एसएसएच सर्वर क्लाइंट को एक संदेश भेज देगा   प्रतिक्रिया के लिए। डेफल्ट 0 है (सर्वर क्लाइंट को संदेश नहीं भेजेगा   चेक।)।


यह भी देखें: विकल्प क्या करते हैं ServerAliveInterval तथा ClientAliveInterval sshd_config में, ठीक है?


18
2017-10-02 13:52





मैं बिल्कुल मोश से प्यार करता हूँ। मैं अक्सर एक सर्वर में एसएसएच करता हूं, अपना लैपटॉप बंद करता हूं और एक कैफे में जाता हूं, इसे खोलता हूं और जैसे कुछ भी नहीं बदला जाता है।

मोश (मोबाइल खोल)

रिमोट टर्मिनल एप्लिकेशन जो अनुमति देता है घूमना, समर्थन करता है रुक-रुक कर   कनेक्टिविटी, और बुद्धिमान प्रदान करता है स्थानीय   गूंज और उपयोगकर्ता कीस्ट्रोक के लाइन संपादन।

मोश एसएसएच के लिए एक प्रतिस्थापन है। यह अधिक मजबूत और उत्तरदायी है,   खासकर वाई-फाई, सेलुलर और लंबी दूरी के लिंक पर।

मोश मुफ्त सॉफ्टवेयर है, जीएनयू / लिनक्स, फ्रीबीएसडी, सोलारिस, मैक ओएस एक्स और एंड्रॉइड के लिए उपलब्ध है।


16
2017-09-30 18:48





मेरे लिए, मैं मिल रहा था Write failed: Broken pipe यहां तक ​​कि जब मैं सक्रिय रूप से विम या शेल प्रॉम्प्ट पर टाइप कर रहा था। मैं या तो थोड़ी देर के लिए स्थानीय रूप से इंटरनेट ब्राउज़ नहीं कर सका। (मैं टर्मिनल का उपयोग कर उबंटू से दूरस्थ रूप से कनेक्ट कर रहा था।)

मेरे नेटवर्क में अन्य नेटफ्लिक्स और अन्य स्थानों से बहुत सारे वीडियो स्ट्रीम करते हैं। मैं इसे साबित नहीं कर सकता, लेकिन मुझे संदेह है कि यह एक आईएसपी या राउटर मुद्दा है। उदाहरण के लिए, वेरिज़ोन और नेटफ्लिक्स एक दूसरे पर अपने ग्राहक की नेटवर्क समस्याओं के लिए उंगलियों को इंगित कर रहे हैं।

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


4
2017-07-30 13:33





मेरे पास रिमोट सर्वर पर एक स्क्रिप्ट है जो एसएसएच कॉन्फ़िगरेशन क्लाइंट या सर्वर के बावजूद विफल होने लगती है।

#!/bin/bash
while true; do date; sleep 10; done;

इसे कुछ dummy.sh फ़ाइल में सहेजें और विंडो को कम करने या उससे दूर जाने से पहले इसे तुरंत चलाएं। यह सर्वर पर वर्तमान समय टिकट मुद्रित रखेगा और जब तक कनेक्शन किसी अन्य कारण से नहीं छोड़ा जाता है तब तक आपका कनेक्शन ज़िंदा रहता है। जब आप उस टर्मिनल पर वापस आते हैं, तो बस CTRL + C दबाएं और काम करते रहें।


3
2017-09-09 16:50



या बस छोड़ दो top दौड़ना - Eben Geer


जब भी आप ssh का आह्वान करते हैं, तो आप इन तर्कों को जोड़ सकते हैं: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

यदि आप ऐसा करते हैं तो आपको / etc / ssh / * config फ़ाइलों को संपादित करने की आवश्यकता नहीं है।

यह आसान बनाने के लिए आप एक बैश उपनाम या फ़ंक्शन या स्क्रिप्ट बना सकते हैं।

जैसे इन बैश फ़ंक्शंस, आप अपने .bashrc में जोड़ सकते हैं, do_ssh को रखरखाव चालू करने के लिए मैन्युअल रूप से उपयोग किया जाता है। do_ssh_pty को पट्टी सेट करने और संकेतों से बचने के लिए स्क्रिप्ट के भीतर उपयोग किया जाता है।

do_ssh() {
    ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

do_ssh_pty() {
    ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

अभी व do_ssh user@host इस्तेमाल किया जा सकता है या do_ssh user@host <args> <command> और रखरखाव सक्रिय हो जाएगा।


0
2018-02-12 13:05