SSH सत्र शटडाउन / रिबूट पर लटका हुआ है


13

मेरे पास एक सर्वर है जो डेबियन चलाता है और उस पर sshd करता है, और अगर मुझे सर्वर को रिबूट करने की आवश्यकता होती है तो मेरा SSH सत्र क्लाइंट साइड पर TCP टाइमआउट तक लटका रहता है। मैं यह मानता हूं क्योंकि जब sshdइसे समाप्त किया जा रहा है तो यह मेजबान के लिए खुले एसएसएच सत्रों को स्पष्ट रूप से बंद नहीं करता है। मुझे sshdपहले सभी को डिस्कनेक्ट करने के लिए क्या करना चाहिए , फिर खुद को सामान्य के रूप में समाप्त करना चाहिए ? अब तक मुझे ऐसा कोई पैरामीटर नहीं दिखाई दिया है जो man sshd_configकि शॉटाउन व्यवहार से संबंधित हो।


1
जब अन्य सभी विफल हो जाते हैं, तो आप [Enter] [~] [] दबाकर किसी भी समय SSH क्लाइंट को मार सकते हैं। वास्तव में आपकी समस्या को हल करने के तरीके के बारे में स्पष्टीकरण।
n.st

जवाबों:


32

जब आप अपने सिस्टम को शटडाउन या रिबूट करते हैं, systemdतो जितनी जल्दी हो सके सभी सेवाओं को रोकने की कोशिश करता है। इसमें नेटवर्क को नीचे लाना और सभी प्रक्रियाओं को समाप्त करना शामिल है जो अभी भी जीवित हैं - आमतौर पर उस क्रम में। इसलिए जब systemd आपके SSH सत्रों को संभालने वाली कांटेदार SSH प्रक्रियाओं को मारता है, तो नेटवर्क कनेक्शन पहले से ही अक्षम है और उनके पास ग्राहक कनेक्शन को इनायत से बंद करने का कोई तरीका नहीं है।

आपका पहला विचार शटडाउन के दौरान पहले चरण के रूप में सभी SSH प्रक्रियाओं को मारने का हो सकता है, और वहाँ बहुत सी systemd सेवा फाइलें हैं जो बस ऐसा ही करती हैं।

लेकिन निश्चित रूप से एक निरर्थक समाधान है (यह कैसे किया जाना चाहिए "माना जाता है) systemd-logind:।
systemd-logindसक्रिय उपयोगकर्ता सत्रों (स्थानीय और एसएसएच वाले) का ट्रैक रखता है और तथाकथित "स्लाइस" के लिए उनके भीतर स्पॉन की गई सभी प्रक्रियाओं को असाइन करता है। इस तरह से, जब सिस्टम बंद हो जाता है, तो सिस्टम स्लाटर को उपयोगकर्ता स्लाइस के अंदर सब कुछ (जिसमें एक विशेष सत्र सौंपने वाली कांटे वाली SSH प्रक्रिया शामिल है) बस SIGTERM कर सकता है और फिर सेवाओं और नेटवर्क को बंद करना जारी रख सकता है।

systemd-logindनए उपयोगकर्ता सत्रों की सूचना पाने के लिए PAM मॉड्यूल की आवश्यकता होती है और आपको इसकी स्थिति की जांच करने के dbusलिए उपयोग loginctlकरने की आवश्यकता होगी , इसलिए उन दोनों को स्थापित करें:

apt-get install libpam-systemd dbus

सुनिश्चित करें कि आपका /etc/ssh/sshd_configवास्तव में मॉड्यूल का उपयोग करने जा रहा है UsePAM yes


ठीक है, लक्ष्य हासिल किया, और स्पष्टीकरण के लिए धन्यवाद। (हालांकि मैं शटडाउन के लिए निर्भरता नियंत्रण का कुछ तरीका चाहूंगा, ताकि सब कुछ पहले SIGTERM'd हो, अपने काम को पूरा करने में सक्षम हो, यह एक स्तरित समाधान के रूप में कर सकता है।)
वेस्पर

केवल StackOverflow पर जाते समय किसी कारण से मुझे उत्तर के बारे में सूचित नहीं किया गया था। अजीब।
वेस्पर

1
तो, संक्षेप में, शटडाउन में केवल कुछ सेकंड शेव करने के लिए, हमें अपने कनेक्शन को सही तरीके से पूरा करने के लिए बकवास का एक पूरा लोड स्थापित करना होगा? गंभीरता से? यह गज़ब हो रहा है। हम बर्बाद हो गये।
ल्यूकोस

3
ध्यान दें कि libpam-systemd और dbus स्थापित करने के बाद पहले रिबूट करें फिर भी आपका SSH सत्र लटका रहेगा। इससे बचने के लिए, इसके बजाय reboot, shutdown -rजो 1 मिनट की देरी के लिए चूक करते हैं, आपको एसएसएच सत्र बंद करने का समय देता है।
mivk

9

यह कुछ ऐसा है जिसे आपको क्लाइंट साइड पर सेट करना होगा, न कि सर्वर साइड पर। अपने ~/.ssh/configको सम्‍मिलित करें

ServerAliveInterval 15
ServerAliveCountMax 5

इसका मतलब है कि 15 सेकंड की निष्क्रियता के बाद, आपका क्लाइंट सर्वर को एक संदेश भेजेगा। यदि इसे कोई प्रतिक्रिया नहीं मिलती है, तो यह 5 बार तक फिर से कोशिश करेगा, और जब इसे अभी भी जवाब नहीं मिलता है, तो यह सत्र बंद कर देगा।


2
यह ssh क्लाइंट रिपोर्ट सर्वर के मृत होने से पहले 75s देरी का परिणाम देगा। सही?
वेस्पर

1
हां, और आप छोटे टाइमआउट पाने के लिए मापदंडों को समायोजित कर सकते हैं।
टेरो किलकेनन

इससे मेरे लिए समस्या हल हो गई। इस तरह की परेशान करने वाली समस्या।
जस्टिन एंड्रसक

5

इस व्यवहार को इस डेबियन बग पर सूचित किया गया है , आपको केवल पैकेज के साथ रखी शटडाउन स्क्रिप्ट को सही ढंग से सेटअप करने की आवश्यकता है क्योंकि, स्वचालित रूप से, वे डिफ़ॉल्ट रूप से कॉपी नहीं किए जाते हैं:

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

1

आप उन विकल्पों को निर्दिष्ट कर सकते हैं जो जेनी डी ने अपने जवाब में सिर्फ एक एसएस कमांड के लिए बात की थी, जैसे कि

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

यदि आप अक्सर ऐसा करते हैं, तो आप इसे स्क्रिप्ट कर सकते हैं।


0

मेरे लिए lshd के साथ काम करता है। तो समाधान होगा

apt install lsh-server
apt remove openssh-server

0

दुख की बात है कि सर्वर ने मुझे सालों से बहुत कम बिंदुओं के कारण थ्रेड में जवाब नहीं दिया। लेकिन मुझे अनलॉक करने के लिए अन्य ब्लॉगों में स्पैम करने की आवश्यकता नहीं है ^ ^ ... इसलिए समर्पित उत्तर:

जैसा कि Rfraile ने उल्लेख किया है

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

काम करता है। उदाहरण / सर्वर को रिबूट किए बिना इसका उपयोग करने के लिए आपको अतिरिक्त कार्य करना चाहिए:

systemctl daemon-reload
systemctl start ssh-session-cleanup.service

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


तो क्या आप सिर्फ एक और जवाब दोहरा रहे हैं?
राल्फफ्राइडल

नहीं? मैंने ऊपरी उत्तर के लिए केवल संदर्भ के रूप में 2 पंक्तियों का उपयोग किया क्योंकि मैं अभी तक लिखित रूप में उत्तर नहीं दे सकता। मैंने रिबूट के बिना इसका उपयोग करने के लिए आवश्यक कदम जोड़े। यह एक अन्य प्रश्न सूत्र में भी दिया जा सकता है, लेकिन मैंने इसकी जाँच नहीं की है।
रेनियर ०३०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.