मैं अपने SSH सत्रों को ठंड से कैसे रख सकता हूं?


65

मेरे पास ServerAliveIntervalऔर कुछ मशीनों के मामले में भी ClientAliveIntervalSSH क्लाइंट / सर्वर कॉन्फ़िगरेशन फ़ाइलों में 540 पर सेट है (मुझे लगता है कि इसे सेट करना अधिक से अधिक एक अच्छा विचार नहीं होगा)। मैं कई एसएसएच सत्रों के साथ काम करता हूं जो वर्तमान में कुछ मिनटों के बाद फ्रीज हो जाता है।

मेरे द्वारा यह कैसे किया जा सकता है? मैं जो चाहता हूं, वह है कि एक सत्र को फ्रीज न किया जाए, ताकि अगर मैं 8 बजे एक सत्र खोलूं और इसे 4 घंटे तक उपयोग न करूं, उदाहरण के लिए, फिर भी इसे लॉग-इन किए बिना 12 पर फिर से उपयोग करना है ।


आप वर्तमान में कितने समय तक लॉग इन रह सकते हैं (यह मानते हुए कि यह नेटवर्क वियोग के कारण नहीं है)? TCPKeepAlive yes?
इयरिन

मुझे यकीन नहीं है, लेकिन 10 मिनट। ज्यादा से ज्यादा। के रूप में TCPKeepAlive yes- मशीन पर निर्भर करता है।
सिंटगमा

11
बस mosh का उपयोग करें ?
वि।

1
या आप उपयोग कर सकते हैं autossh...
थोरियम बीआर

मैं कहूंगा कि 4 घंटे के लिए एक कनेक्शन खुला छोड़ना एक सुरक्षा चिंता का विषय है, और आपको screenइसके बजाय उपयोग करना चाहिए । लेकिन मैं अभी भी आपके प्रश्न को बढ़ा रहा हूं क्योंकि मैं केवल एक या दो मिनट के बाद उसी मुद्दे का सामना कर रहा हूं।
डेल एंडरसन

जवाबों:


79

आपके द्वारा किए गए परिवर्तन सही हैं /etc/ssh/ssh_configऔर /etc/ssh/sshd_configफिर भी कोई प्रभाव नहीं पड़ेगा।

अपने कॉन्फ़िगरेशन को काम करने के लिए, क्लाइंट पर ये कॉन्फ़िगरेशन परिवर्तन करें:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval क्लाइंट कनेक्शन को जीवित रखने के लिए सर्वर को प्रत्येक 100 सेकंड में एक अशक्त पैकेट भेजेगा

NULL पैकेट सर्वर द्वारा क्लाइंट को भेजा जाता है। क्लाइंट द्वारा सर्वर को एक ही पैकेट भेजा जाता है। TCP NULL पैकेट में SYN, ACK, FIN आदि जैसे कोई भी नियंत्रित ध्वज नहीं होता है क्योंकि सर्वर को क्लाइंट से उत्तर की आवश्यकता नहीं होती है। NULL पैकेट यहाँ वर्णित है: https://tools.ietf.org/html/rfc6592

फिर सर्वर पर sshd भाग को कॉन्फ़िगर करना।

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval सर्वर कनेक्शन को जीवित रखने के लिए क्लाइंट को एक नल पैकेट भेजने से पहले 60 सेकंड इंतजार करेगा

TCPKeepAlive यह सुनिश्चित करने के लिए है कि कुछ फ़ायरवॉल निष्क्रिय कनेक्शन को न छोड़ें।

ClientAliveCountMax सर्वर क्लाइंट को जीवित संदेश भेजेगा भले ही उसे ग्राहक से कोई संदेश वापस न मिला हो।

अंत में पुनः आरंभ करें ssh server

service ssh restart या service sshd restartआप किस सिस्टम पर निर्भर हैं।


मुझे लगता है कि इसके लिए एक उच्च ServerAliveCountMaxभी आवश्यक है ताकि जितना संभव हो उतना विश्वसनीय हो। और अगर दोनों ServerAliveIntervalऔर ClientAliveIntervalकाफी कम सेट कर रहे हैं, मुझे नहीं लगता कि किसी भी आवश्यकता नहीं होगी है TCPKeepAlive। इसके अतिरिक्त, अगर कोई मिडबॉक्स हैं, तो वे अभी भी पहले से बताए गए सभी सेटिंग्स के साथ ठीक से सही कॉन्फ़िगर किए गए राज्य खो सकते हैं। यह MPTCP (यदि क्लाइंट और सर्वर दोनों इसे सपोर्ट करते हैं) का उपयोग करने में मदद कर सकता है।
कैस्परड

यह शुरू में स्पष्ट नहीं है कि क्या आप क्लाइंट साइड या सर्वर साइड पर कॉन्फिगर करते हैं (अंततः मैं निष्कर्ष निकालता हूं, क्लाइंट साइड)। तब ServerAliveInterval विवरण में, आप कहते हैं कि "क्लाइंट सर्वर को भेज देगा ...", लेकिन अगले पैराग्राफ में " NULL पैकेट को सर्वर द्वारा क्लाइंट को भेजा जाता है"। मुझे ये थोड़ी गड़बड़ लगती हैं।
क्रेग मैकक्वीन

1
सर्वर में जोड़ने के बाद मुझे मिलता है: / etc / ssh / ssh_config: पंक्ति 57: खराब कॉन्फ़िगरेशन विकल्प: clientaliveinterval / etc / ssh / ssh_config: लाइन 59: खराब कॉन्फ़िगरेशन विकल्प: clientalivevountmax
Anders

2
@ और आप त्रुटि प्राप्त करते हैं क्योंकि ClientAliveIntervalऔर ClientAliveCountMaxssh सर्वर विकल्प हैं, इस प्रकार मतलब है sshd_configऔर नहींssh_config
वैलेंटाइन बजरमी

1
@ चंद्रेश आपके पास नहीं है। ssh_configनए सत्रों को संशोधित करने के बाद वह फ़ाइल पढ़ेगा। /etc/environmentफ़ाइल जिसमें से प्रारूप है एक अलग बात है VAR="value" बिना रिक्त स्थान इस प्रकार VAR = "value"अवैध होगा। /etc/ssh/ssh_configइस तरह से सोर्सिंग करना यानी पढ़ना होगा: Port 22या Host * जो इन्हें कमांड के रूप में मानेंगे
वैलेंटाइन बजरमी

13

व्यक्तिगत सुझाव: screenरिमोट होस्ट पर उपयोग ; यह आपके कनेक्शन को तब तक जीवित रखने का प्रबंधन करेगा जब तक कि यह टर्मिनल में सक्रिय रहता है।

यहां मैं /etc/screenrcअपने स्क्रीन सत्रों की त्वरित पहचान के लिए आमतौर पर जोडता हूं:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

संपादित करें: संकेत।

hardstatusस्ट्रिंग इसी प्रकार के एक नीचे स्थिति लाइन दिखाएगा: तीन खुले टैब के साथ स्क्रीन सत्र उदाहरण

स्क्रॉलबैक बफर को भी सामान्य 1000-1500 (वितरण के आधार पर) के बजाय 8192 लाइनों तक बढ़ाया जाता है।


धन्यवाद, दो प्रश्न: 1. क्या आप screenrcफ़ाइल में विकल्पों की व्याख्या कर सकते हैं ? मैं लॉगिन करने के तुरंत बाद सिस्टम को लॉन्च स्क्रीन / tmux कैसे कॉन्फ़िगर करूं?
सिंटगमा

8
बस स्पष्ट करने के लिए, screenआपके ssh कनेक्शन को जीवित नहीं रखता है। यह आपके द्वारा कनेक्ट किए गए उपयोगकर्ता टर्मिनल से स्वतंत्र वर्चुअल टर्मिनल में प्रक्रियाएं चलाता है sshताकि प्रक्रिया आपके कनेक्शन पर निर्भर न हो। sshयह हल होने तक आप अपना कनेक्शन खो देंगे ।
इयरिन

1
" कनेक्शन को जीवित रखने के द्वारा" मेरा अनिवार्य रूप से मतलब है " कनेक्शन को निष्क्रिय होने से रोकता है ", जिसका एक ही परिणाम है। यदि 4 घंटे के लिए कोई इनपुट नहीं है, तो SSH निष्क्रिय हो जाएगा और अंततः कनेक्शन बंद कर देगा, सभी बच्चे प्रक्रियाएं चले गए, भी।

2
जितना मैं प्यार करता था screen, मैं नए उपयोगकर्ताओं को सलाह देता हूं कि वे शुरू करें tmux
डॉटकोहेन

2

OpenSSH के साथ:

आपको सक्षम करने की आवश्यकता है

TCPKeepAlive yes

आपके क्लाइंट में ssh_config (जैसे /etc/ssh/ssh_configया ~/.ssh/config) और आपका गंतव्य SSSS सर्वर OpenSSH (जैसे / etc / ssh / sshd_config) चल रहा है।

तो हर बार जब आपका कनेक्शन बेकार होता है, OpenSSH आपके गंतव्य होस्ट को कुछ डमी पैकेट भेजता है ...


यह भी कनेक्शन The default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. linux.die.net/man/5/sshd_config
iyrin

ईमानदारी से, लेकिन "[…] network goes down […] client host crashes […] route is down […]"गंभीर त्रुटियां हैं जिन्हें कोई एसएसएच कॉन्फ़िगरेशन नहीं पकड़ सकता है। यहाँ मुख्य मुद्दा निष्क्रिय SSH सत्र हैं, न कि नेटवर्क विफलताएँ। इसलिए इसे योग करने के लिए: - TCPKeepAlive yesसर्वर और क्लाइंट दोनों में सक्षम करें। - ClientAliveInterval सर्वर IdleTimeoutपर सेट - सर्वर पर सेट - सेट ClientAliveCountMax कि चाल करना चाहिए ...
मार्टिन Allert

2

यदि समस्या एक हाइबरनेट किया गया लैपटॉप या कम-से-प्रीफेक्ट नेटवर्क कनेक्शन है, तो मैं अनुशंसा करता हूं कि इसका उपयोग moshअधिक से अधिक हो sshऔर स्वचालित पुनर्गठन की अनुमति हो।

से वेबसाइट :

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

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

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

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

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


यहाँ mosh.org और Github पर mosh
joeytwiddle

1

सेटिंग के/etc/sshd_config लिए होस्ट मशीन पर अपने sshd कॉन्फ़िगरेशन की जाँच करें । IdleTimeout

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.