SSH सत्र को जीवित रखें [बंद]


241

मैं ssh -p8520 username@remote_hostदूरस्थ सर्वर लॉगिन करने के लिए उपयोग करता हूं ।

मुद्दा :

जब मैं कार्य स्थल पर होता हूं तो यह हमेशा जुड़ा रहता है और ठीक से काम करता है। दुर्भाग्य से, टर्मिनल 10 से 15 मिनट में फ्रीज हो जाता है जब मैं घर से रिमोट सर्वर से जुड़ा होता हूं।

कंसोल पर कोई त्रुटि / टाइमआउट रिपोर्ट नहीं है, लेकिन कर्सर किसी भी अधिक स्थानांतरित नहीं कर सकता है।

जब wलॉगिन उपयोगकर्ताओं की जांच करने के लिए प्रवेश करते हैं, तो कुछ लाश लॉगिन उपयोगकर्ता होते हैं, और मुझे उन्हें मैन्युअल रूप से मारना होगा।

यह काफी कष्टप्रद है। क्या कोई मेरी मदद कर सकता है?


मेरे पास भी यह था, मैंने उपयोग करना शुरू कर दिया screen। शायद यह किसी प्रकार का टाइमआउट मुद्दा है।
मार्टिन

@ स्मार्टिन screenप्रोग्राम को चालू रखने में मदद करता है। दुर्भाग्य से कभी-कभी मुझे रिमोट सर्वर पर काम करना पड़ता है :(
हाइफ़ेंग झांग

यदि आप इसे मापदंडों के बिना शुरू करते हैं, तो यह आपको एक शेल देता है।
मार्टिन

क्या तुम्हारा screenही कहना है ? यह खो कनेक्शन समस्या को हल कर सकता है? नहीं screen -S screenName? मैं हमेशा -S-r
हैफेंग झांग

1
नहीं, इससे समस्या हल नहीं होती है, आप केवल टर्मिनल में अपना काम खो देने से बचते हैं। यदि आप कुछ भी नहीं करते हैं, तो यह अभी भी जम जाएगा, आप बस उठा सकते हैं जहां आपने शुरू किया था। मेरा मतलब था कि आप एक टर्मिनल बना सकते हैं जिसे आप हमेशा उपयोग करके फिर से शुरू कर सकते हैं screen। आप पहले से ही जानते हैं कि लगता है;)
martin

जवाबों:


450

Ssh डेमॉन (sshd), जो सर्वर-साइड चलाता है, क्लाइंट-साइलेंट से कनेक्शन बंद कर देता है यदि क्लाइंट चुप हो जाता है (यानी, जानकारी नहीं भेजता है)। कनेक्शन के नुकसान को रोकने के लिए, ssh क्लाइंट को एक बार सर्वर पर साइन-ऑफ-लाइफ सिग्नल भेजने का निर्देश दें।

इसके लिए कॉन्फ़िगरेशन फ़ाइल में है $HOME/.ssh/config, अगर यह मौजूद नहीं है तो फ़ाइल बनाएं (कॉन्फ़िगरेशन फ़ाइल विश्व-पठनीय नहीं होनी चाहिए, इसलिए chmod 600 ~/.ssh/configफ़ाइल बनाने के बाद चलाएँ )। दूरदराज के मेजबान को हर चार मिनट (240 सेकंड) जैसे संकेत भेजने के लिए, निम्नलिखित को उस कॉन्फ़िगरेशन फ़ाइल में रखें:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

सभी मेजबानों के लिए एक ज़िंदा संकेत भेजने में सक्षम करने के लिए, कॉन्फ़िगरेशन फ़ाइल में निम्न सामग्री रखें:

Host *
    ServerAliveInterval 240

24
@ user271996, क्लाइंट-साइड सेटिंग के लिए डेमॉन को फिर से क्यों शुरू करना चाहिए?
मैक्सक्लेपज़िग

कॉन्फ़िगरेशन केवल उपयोगकर्ता-योग्य होना चाहिए। पठनीयता कोई चिंता का विषय नहीं है। आपके अनुमति स्तर के रूप में 600 का उपयोग करना ठीक है क्योंकि केवल उपयोगकर्ता-योग्य है।
जुलुनी

1
अगर यह स्पष्ट नहीं है कि यह कॉन्फिग फाइल आपके पीसी /
लाइन

5
मैं हमेशा कॉन्फ़िगर नाम के बारे में भ्रमित हो जाता हूं: क्लाइंट ServerAliveInterval सर्वर का उपयोग करते समय उपयोग करता है ClientAliveInterval । क्या झंझट है।
youkaichao

@youkaichao में अक्सर यह भ्रम होता है। एपीआई डिजाइनर के रूप में, ऐसे कारण हैं कि मैं इसे दोनों तरीकों से रख सकता हूं। अंततः, जो सबसे महत्वपूर्ण है, वह चुने गए मानक का अच्छा प्रलेखन है।
कैमरन टैकलिंड

170

मैं एक बार समाधान चाहता था:

ssh -o ServerAliveInterval=60 myname@myhost.com

इसे एक उपनाम में संग्रहीत:

alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'

अब इस तरह से कनेक्ट कर सकते हैं:

me@MyMachine:~$ sshprod

12
यह अच्छा है, लेकिन वास्तव में "एक बार का समाधान" नहीं है। आप एक बार से अधिक सर्वर से कनेक्ट करने जा रहे हैं, क्यों नहीं Host *और ServerAliveInterval 240(या होस्टनाम निर्दिष्ट करते हैं, अगर आप केवल के लिए यह चाहते myname@myhost.comrockymonkey555 के जवाब में के रूप में एक उपनाम की स्थापना किसी भी तरह से आसान नहीं प्रतीत होता है?।
Lambart

8
या, बस अपने ~ / .bashrc में एक उपनाम बनाएं:alias ssh='ssh -o ServerAliveInterval=60'
Jabba

15
उसका अर्थ है "एक समय" जैसा कि "यह केवल एक समय में काम करता है", न कि "मुझे केवल इसे एक बार लिखना है"।
जोनाथन हार्टले

1
हां, यदि आप "एक समय" को "एकल उपयोग" के रूप में पढ़ते हैं, तो यह पूरी तरह से काम करता है।
दर्शन

यदि आप एक "वन-लाइनर" ServerAliveIntervalचाहते हैं 60, जो महान हो। हालाँकि, जब आप उपयोग कर सकते हैं तो एक बैश उपनाम का उपयोग .ssh/configकरना मूर्खतापूर्ण है।
कैमरन टैकलिंड

50

सोच रहे लोगों के लिए, @ एडवर्ड-तट

यदि आप सर्वर के लिए जीवित रखना चाहते हैं , तो इसे इसमें जोड़ें /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : सेकंड में एक टाइमआउट अंतराल सेट करता है जिसके बाद यदि क्लाइंट से कोई डेटा प्राप्त नहीं हुआ है, तो sshd (8) क्लाइंट से प्रतिक्रिया का अनुरोध करने के लिए एन्क्रिप्टेड चैनल के माध्यम से एक संदेश भेजेगा।

ClientAliveCountMax : क्लाइंट ज़िंदा संदेशों की संख्या सेट करता है (नीचे देखें) जो sshd (8) के बिना भेजा जा सकता है जो ग्राहक से कोई संदेश प्राप्त करता है। यदि क्लाइंट लाइव संदेश भेजे जा रहे हैं तो यह सीमा समाप्त हो जाती है, sshd सत्र को समाप्त करते हुए ग्राहक को डिस्कनेक्ट कर देगा।


ऐसा लगता है कि ClientAliveInterval में ऐसा कोई "पैरामीटर" नहीं है, केवल ServerAliveInterval है, आप मैन्युअल पेज "man ssh_config" में देख सकते हैं
dtj

6
यह गलत है, ssh डेमॉन चलाने वाले सर्वर भाग के लिए "man sshd_config" में देखें, क्लाइंट कॉन्फिगर नहीं।
जेफ डेवनपोर्ट

क्या मुझे ClientAliveIntervalक्लाइंट को जिंदा रहने के लिए सर्वर को चेक करने के लिए उपयोग करना चाहिए या क्या मुझे क्लाइंट को ServerAliveIntervalबार-बार सर्वर को "पिंग" करने देना चाहिए ? दोनों समझ में नहीं आता है
qrtLs

1
केवल ClientAliveIntervalसर्वर पर सेट करें यदि आप चाहते हैं कि सर्वर मृत कनेक्शनों पर डिस्कनेक्ट करें जो प्रतिक्रिया नहीं करते हैं, और आप ऐसा कब और कितनी बार अनुकूलित कर सकते हैं।
जेफ डेवनपोर्ट


10

हम निम्नलिखित वैश्विक विन्यास करके अपने ssh कनेक्शन को जीवित रख सकते हैं

/etc/ssh/ssh_configफ़ाइल में निम्न पंक्ति जोड़ें :

ServerAliveInterval 60

क्या यह केवल क्लाइंट के लिए काम करता है या यह sshd के लिए भी काम करता है?
एडवर्ड कोस्ट

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