Sshd_config में `ServerAliveInterval` और` ClientAliveInterval` के कौन से विकल्प वास्तव में काम करते हैं?


161

मुझे यह प्रश्न मिला , लेकिन मुझे खेद है कि मैं दो चर पर सेटिंग्स को नहीं समझता ServerAliveIntervalऔर ClientAliveIntervalस्वीकार किए गए उत्तर में उल्लेख किया गया है। यदि मेरा स्थानीय सर्वर टाइम आउट कर रहा है, तो क्या मुझे यह मान शून्य पर सेट करना चाहिए? यह तो कभी समय नहीं होगा? क्या मुझे इसके बजाय इसे 300 सेकंड या कुछ और पर सेट करना चाहिए?

मेरा सवाल बस यह है कि मेरे कुछ कनेक्शन का समय निकल जाए जब मैं निलंबित कर दूं और फिर अपने लैपटॉप को प्रतिक्रिया के साथ अनसेंड कर दूं Write failed: Broken pipeऔर कुछ नहीं। मैं किसी स्थानीय sshd को सही ढंग से कैसे कॉन्फ़िगर कर सकता हूं ताकि वे टूटे हुए पाइप के साथ विफल न हों?

जवाबों:


202

ServerAliveInterval : सर्वर को अशक्त पैकेट भेजने से पहले ग्राहक ( सेकंड में कनेक्शन रखने के लिए) प्रतीक्षा करने वाले सेकंड की संख्या ।

ClientAliveInterval : सर्वर को एक शून्य पैकेट भेजने से पहले ( सर्वर कनेक्शन को जीवित रखने के लिए) प्रतीक्षा करने वाले सेकंड की संख्या ।

0 का मान सेट करना (डिफ़ॉल्ट) इन सुविधाओं को अक्षम कर देगा ताकि आपका कनेक्शन गिर जाए अगर यह बहुत लंबा है।

ServerAliveInterval किसी कनेक्शन को जीवित रखने के लिए सबसे आम रणनीति लगती है। टूटी हुई पाइप समस्या को रोकने के लिए, यहाँ ssh config का उपयोग मैंने अपने .ssh / config फाइल में किया है:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

उपरोक्त सेटिंग निम्न तरीके से काम करेगी,

  1. ग्राहक 60 सेकंड (ServerAliveInterval समय) के लिए बेकार का इंतजार करेगा और, सर्वर को "नो-ऑप नल पैकेट" भेजेगा और प्रतिक्रिया की उम्मीद करेगा। यदि कोई प्रतिक्रिया नहीं आती है, तो यह उपरोक्त प्रक्रिया को 10 (ServerAliveCountMax) समय (600 सेकंड) तक जारी रखेगा। यदि सर्वर अभी भी प्रतिक्रिया नहीं करता है, तो क्लाइंट ssh कनेक्शन को डिस्कनेक्ट करता है।

ClientAliveCountMax सर्वर साइड पर भी मदद कर सकता है। यह इस बात की सीमा है कि किसी ग्राहक को डिस्कनेक्ट होने से पहले कितने समय तक अनुत्तरदायी रहने दिया जाता है। डिफ़ॉल्ट मान 3 है, जैसा कि तीन ClientAliveInterval में है।


ठीक है, इसलिए मैं शून्य सेकंड की व्याख्या करने के लिए "जिंदा नहीं रखूंगा" जो कि क्लाइंट / सर्वर को प्रदूषित नहीं करता है?
एम। टिबबिट्स

3
yup 0 = एक अशक्त पैकेट न भेजें। एक और भिन्न यह होगा कि ServerAliveInterval क्लाइंट कॉन्फ़िगरेशन में सेट किया गया है जबकि ClientAliveInternal सर्वर कॉन्फ़िगरेशन में सेट है।
बार्थेलेमी

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

ServerAlive भाग निश्चित रूप से है। ClientAliveInterval / ClientAliveCountMax यहाँ क्या मदद करेगा।
जावद छिपकली

1
इस पुराने उत्तर को देखते हुए, मेरा मानना ​​है कि शीर्षक में प्रश्न का उत्तर दिया गया है और दूसरे पैराग्राफ में प्रश्न नहीं है, इसलिए ServerAliveInternal के बारे में टिप्पणियां निलंबन के लिए सहायक नहीं हैं, जिसके साथ मैं सहमत हूं। @JonasWielicki ClientAliveInterval सस्पेंड के एक मामले में खराब हो सकता है क्योंकि निलंबित क्लाइंट सर्वर का जवाब नहीं देगा और क्लाइंट अंततः क्लाइंटएलाइकाउंटमैक्स के बाद क्लाइंट को डिस्कनेक्ट कर देगा।
बर्थेलेमी

18

यह sshd_configमैनुअल ( man sshd_config) में समझाया गया है :

ClientAliveInterval

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

ClientAliveCountMax

डिफ़ॉल्ट मान है 3. यदि ClientAliveInterval(नीचे देखें) 15 पर सेट है, और ClientAliveCountMaxडिफ़ॉल्ट पर छोड़ दिया जाता है, तो लगभग 45 सेकंड के बाद अनुत्तरदायी एसएसएच ग्राहकों को काट दिया जाएगा। यह विकल्प केवल प्रोटोकॉल संस्करण 2 पर लागू होता है।

क्लाइंट विकल्पों के लिए, इसमें स्पष्टीकरण देखें man ssh_config:

ServerAliveInterval

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

ServerAliveCountMax

डिफ़ॉल्ट मान है 3. यदि, उदाहरण के लिए, ServerAliveInterval15 पर सेट है और ServerAliveCountMaxडिफ़ॉल्ट पर छोड़ दिया जाता है, यदि सर्वर अप्रतिसादी हो जाता है, sshतो लगभग 45 सेकंड के बाद डिस्कनेक्ट हो जाएगा। यह विकल्प केवल प्रोटोकॉल संस्करण 2 पर लागू होता है।

उपरोक्त के आधार पर, 0 का अर्थ है कि यह अक्षम है। इसलिए आपको ब्रोकन पाइप त्रुटि से बचने के लिए इन मूल्यों को पर्याप्त रूप से सेट करना चाहिए ।


सहायक पोस्ट। लेकिन मैं इससे निराश हूं। मैं पूरे स्थान पर बड़े अंतराल सेट कर रहा हूं और मेरा कनेक्शन अभी कुछ ही मिनटों के बाद टूट रहा है। (उबंटू पर खुलश का उपयोग करना, निश्चित नहीं है कि यह प्रासंगिक है)
श्रीधर सरनोबत

1
@ user7000 क्लाइंट (ssh) और सर्वर (sshd) दोनों को कॉन्फ़िगर करें। यह मदद कर सकता है: 'एसएसएच कनेक्शन को दूरस्थ रूप से बंद कर दिया गया था' के साथ मुद्दों को कैसे ठीक किया जाए
केनोरब

मुझे लगता है कि मैं कहीं जा रहा हूं। यह हो सकता है कि मैं ServerAliveIntervalअपनी कॉन्फ़िग फ़ाइल में पहले कोई स्थान नहीं डाल रहा था ।
श्रीधर सरनोबत

15

बर्थेलेमी का उत्तर अच्छा है, लेकिन वास्तव में समस्या की जड़ तक नहीं जाता है। जब आप अपने कंप्यूटर को बूट करते हैं तो आप अपनी मशीन को निलंबित कर देते हैं और चाहते हैं कि SSH सत्र अभी भी जीवित रहे।

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

गंदे वर्कअराउंड के लिए आप कनेक्शन रखने के लिए स्क्रीन के साथ वीपीएस या किसी अन्य ऑनलाइन बॉक्स का उपयोग कर सकते हैं। मेरी सलाह है कि सुरक्षा कारणों से ऐसा न करें।


1
यह वास्तव में एक और केवल सवाल का जवाब है।
कैलिमो

1
यह वास्तव में एक भयानक सुरक्षा समाधान है, ऐसा कभी नहीं करें।
जहरीली

14

चूँकि आप इस बात की गारंटी नहीं दे सकते हैं कि एक एसएसएच कनेक्शन (टीसीपी होने के नाते) एक बार जीवित रहेगा, जब एक छोर प्राप्त पैकेटों के लिए एसीके भेजना बंद कर देता है, मैं अपने सभी एसएसएच कनेक्शनों को पुनः आरंभ करने के लिए व्यक्तिगत रूप से http://www.harding.motd.ca/autossh/ का उपयोग करता हूं। जैसे ही मैं अनसुना करता हूं।

चूंकि जीएनयू स्क्रीन सर्वर साइड पर उपयोग में होगी, इसलिए मुझे फिर से संलग्न करना होगा जहां मैं पहले था।

आप इसे अतिरिक्त बंदरगाहों पर सुन सकते हैं ताकि यह लगातार जांचे कि कनेक्शन अभी भी जीवित हैं, लेकिन व्यक्तिगत रूप से मुझे लगता है कि यह उस अक्षम के साथ काफी अच्छा काम करता है और बस एसएसएच के ServerAliveInterval/ पर निर्भर है ServerAliveCountMax

एक अन्य विकल्प http://mosh.mit.edu/ है जो यूडीपी का उपयोग करता है और कनेक्टिविटी की दीर्घकालिक कमी से मूल रूप से पुनर्प्राप्त करता है।


5

nohupयदि आप चाहते हैं कि आप उन्हें अपने SSH कनेक्शन की परवाह किए बिना चला सकें, तो आप कमांड भी चला सकते हैं ।

जैसे

$ nohup tar -xzf some_huge.tar.gz &

यह &है, मुझे लगता है, आवश्यक नहीं है, लेकिन यह सुविधाजनक है क्योंकि यह पृष्ठभूमि में प्रक्रिया को चलाता है ताकि आप अन्य सामान कर सकें।

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


नोट nohup पर zsh ठीक से काम नहीं करता है!
श्रीधर सरनोबत

@ user7000 इसके बारे में क्या अनुचित है?
बुटिक बटुक

मुझे याद नहीं है, मुझे लगता है कि यह मूल रूप से क्लाइंट के डिस्कनेक्ट होने के बाद प्रक्रिया को चालू नहीं रखता था। यह कुछ साल पहले था और मैंने नोह का उपयोग करना बंद कर दिया और इसके बजाय डिस्बॉन्ड किया।
श्रीधर सरनोबत

2
मुझे लगता है कि zshउपयोगकर्ताओं के साथ चिपके रहते हैं चाहिए disown -hके बजाय nohup, जब तक कि समस्या तब से निर्धारित किया गया है।
बुटिक बटुकस

0

स्क्रीन के अंदर अपना लंबे समय तक चलने वाला सत्र रखें विवरण के लिए स्क्रीन -h देखें

इस तरह आप स्क्रीन सत्र के लिए ssh और reattach का उपयोग करके मशीन को फिर से कनेक्ट कर सकते हैं


मुझे आश्चर्य है कि स्क्रीन का सुझाव देने वाले कितने प्रतिशत लोग वास्तव में इसका उपयोग करते हैं।
श्रीधर सरनोबत

मुझे लगता है कि tmux बेहतर सुझाव है, कोड संशोधन दिनांक जाँच github.com/tmux/tmux बनाम git.savannah.gnu.org/cgit/screen.git/log
सुहैब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.