SSH कनेक्शन पर "लिखें विफल: टूटी पाइप" को कैसे रोकें?


283

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


8
कुछ भी सच नहीं। सत्र बाधित हुआ, और सत्र की सुरक्षा से समझौता किया गया। यदि आप सोने के लिए कंपेयर नहीं करते हैं तो आप क्लाइंट के लिए सर्वर पर बीट हार्ट बीट को शूट करने के लिए एक जीवित समय सेट कर सकते हैं, लेकिन अगर सिस्टम सोने जा रहा है तो ऐसा कुछ भी नहीं है जो किया जा सकता है।
Darkdragn

3
इस मामले में मैं ऐसी चीज की तलाश कर रहा हूं जो मुझे एक टूटे हुए ssh कनेक्शन को फिर से शुरू करने की अनुमति देगा (शायद बाहर निकलने के कोड के आधार पर) और उपयोग करके पुनर्स्थापित करें screen?
सोरिन

4
आप लोग गलत हैं: मेरे पास SAMO सर्वर से जुड़ने वाले दो डेस्कटॉप क्लाइंट मशीन हैं। एक ubuntu 12.10 है, क्वांटल, जिसका एसएसएच क्लाइंट अच्छी तरह से काम करता है, और घंटों तक कनेक्शन रखता है। अन्य उबंटू 14.10 है, यूटोपिक, बस एक तरफ और एक ताजा स्थापित में; कुछ मिनटों के बाद, यह इस संदेश के साथ खुद को ब्लॉक कर देता है। मशीन में नेटवर्क के बाकी कार्य बाधित नहीं हैं। तो नहीं, यह न तो कोई नेटवर्क समस्या है, न ही सर्वर की समस्या है, लेकिन एक विशिष्ट SSH CLIENT सॉफ्टवेयर समस्या है, जिसे हल किया जा सकता है, जो कि "डार्कड्रेगन" के विपरीत कहने की हिम्मत करता है, कि "कुछ भी नहीं किया जा सकता है"।
डेविड एल

2
और वास्तव में, जैसा कि मैंने कहा: लोग बहुत ज्यादा बात करते हैं जब वे कहते हैं कि "कुछ भी नहीं किया जा सकता है", जैसा कि @darkdragn ने हिम्मत की। मैंने अराम कोचरन के उत्तर को पढ़ा, और मैंने इसे लागू किया: 20 मिनट पहले ... मुझे एहसास हुआ कि मेरे पुराने क्वांटल उबंटू में 12.10, मैंने उस फ़ाइल में उस निर्देश को लागू किया था [मैंने अभी जाँच की], दो साल पहले, और वह था वहाँ स्थिरता का कारण। मैंने इसे यहां किया था, और इन अंतिम 20 मिनटों में, कनेक्शन तब से स्थिर है। इसलिए कृपया, लोग: यह सोचने की हिम्मत करते हुए कि "कुछ नहीं किया जा सकता", और अन्य लोगों को उस संदेश को छोड़ने की कोशिश करते समय और भी अधिक परहेज करें।
डेविड एल

11
@ डेविड आपको रेंटिंग से पहले प्रश्नों को बेहतर ढंग से पढ़ना चाहिए। आपकी समस्या ओपी के समान नहीं है, जो स्पष्ट रूप से कंप्यूटर को नींद में डालने का उल्लेख करते हैं। जिस तरह से केवल एक उत्तर पते ("मॉश") में से एक है, और यह प्रश्न के 2 साल बाद पोस्ट किया गया था। हालांकि अन्य जवाब अगली सबसे अच्छी बात करते हैं, जो उन मामलों के समाधान का प्रस्ताव है जो आपके जैसे अधिक आसानी से हल किए जा सकते हैं। चिल आउट, इतना तनाव मत करो, शेख़ी यहाँ के आसपास कोई अच्छा काम नहीं करती ...
msb

जवाबों:


266

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

Host *
ServerAliveInterval 120

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

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

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


4
मैं मैक पर नहीं हूं, लेकिन उबंटू 12.04 और इस ऑपरेटिंग सिस्टम की फाइल भी ~ / .ssh / config लगती है।
H2ONaCl

5
OS X 10.8.4 एक त्रुटि देता हैBad configuration option: ClientAliveInterval
ओहो

3
मुझे Bad configuration optionOSX 10.8.4 पर वही त्रुटि मिलती है।
निक हेइनर

10
आम तौर पर, आप इन दोनों कमांड को सिस्टम के विभिन्न हिस्सों में डालते हैं। OSX क्लाइंट साइड पर केवल ServerAliveInterval ... और sshd config फाइल पर केवल ClientAliveInterval ...
ftrotter

2
मेरे बंदर मुझ से कहा: "आप क्यों टाइप न करें खुद के" शीर्ष [ENTER] "
ऑगस्टो

85

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

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


5
यह शायद सबसे अच्छा जवाब है, मुझे यकीन नहीं है कि यह उच्च मतदान क्यों नहीं है। अन्य "फ़िक्सेस" उस विशेष मामले में सहायक होते हैं जहाँ आप वास्तव में SSH कनेक्शन बनाए रखने के बारे में परवाह करते हैं, लेकिन ज्यादातर उपयोग के मामलों में मुझे लगता है कि असली चिंता यह है कि किसी भी क्लाइंट / सर्वर कनेक्शन मुद्दों की परवाह किए बिना इच्छित प्रक्रियाएं चलती रहें। ।
पॉल मैकमुर्डी

16
मैं Tmux को स्क्रीन के विकल्प के रूप में भी जोड़ूंगा । मुझे यह स्क्रीन की तुलना में अधिक बहुमुखी और स्थिर लगता है।
शुक्रवार

2
भविष्य के संदर्भ के लिए इसे यहां छोड़ना - आप आसानी screen -d -rसे अपने पिछले सत्र को पुनर्प्राप्त करने के लिए चला सकते हैं ।
doplumi

2
या बस screen -dr। या screen -xआप जो कर रहे हैं उसके आधार पर। मुद्दा यह है कि किसी को यह जानना चाहिए कि वे सभी स्विच क्या करते हैं, ताकि व्यक्ति उचित उपयोग कर सके और न केवल नेत्रहीन लोगों के सुझावों का पालन करें। : वहाँ एक अच्छा कॉम्पैक्ट सारांश उपलब्ध यहाँ है ss64.com/bash/screen.html
flith

यह समस्या का जवाब नहीं है
user3728501

46

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

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

~/.ssh/config

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

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

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

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

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

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

सर्वर कॉन्फ़िगरेशन

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

ClientAliveInterval 20
ClientAliveCountMax 5

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


यह काम नहीं करता है। मैं फिर से उसी त्रुटि का सामना कर रहा हूं।
user997704

3
कमांड लाइन से इसे सीधे आज़माएँ और नीचे जाएँ: ssh -o ServerAliveInterval = 5 उपयोगकर्ता @ होस्ट
मैट

कोशिश की कि भी .. काम नहीं करेगा। मैं वास्तव में नहीं जानता कि मेरे सिस्टम के साथ क्या हो रहा है
user997704

2
यह ClientAliveCountMax है, नहीं ClientAliveMaxCount
David G

@DavidG कृपया अपने सुधार के साथ उत्तर संपादित करें।
CivMeierFan

23

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

TCPKeepAlive yes

में

/etc/ssh/ssh_config

20

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

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

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

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


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

ClientAliveInterval 600
ClientAliveCountMax 0

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

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

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


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


क्लाइंट पर डिफ़ॉल्ट से अधिक एक ServerAliveCountMax सेट करना भी कनेक्शन को धीमा कनेक्शन के लिए लाइव रखने में मदद करना चाहिए।
जॉनीजैंडल्स

17

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

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

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

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

Mosh मुफ्त सॉफ्टवेयर है, जो GNU / Linux, FreeBSD, Solaris, Mac OS X और Android के लिए उपलब्ध है।


6

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

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

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


3

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

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

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


9
या बस topभागना छोड़ दें
Eben Geer


1

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

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

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

उदाहरण के लिए ये बैश फ़ंक्शंस, आप अपने .bashrc में जोड़ सकते हैं, do_ssh का उपयोग मैन्युअल रूप से रखने के लिए किया जाता है। do_ssh_pty का उपयोग स्क्रिप्ट में 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>रखवाले सक्रिय हो जाएंगे।

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