जब SSH उपयोगकर्ता लॉग इन होता है तो शटडाउन को कैसे रोकें?


20

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


EDIT (अतिरिक्त जानकारी।):

नेटवर्क पर 4 OS हैं: मैनड्रिव 2009, मैनड्रिव 2010.2, मैनड्रिव 2011 और उबंटू 11.04। मैं जिस विशिष्ट मामले का जिक्र कर रहा हूँ, वह मांडवी २०० ९ की मेजबानी में एसएसएच उपयोगकर्ता और मांडवी २०११ के मेज़बान पर स्थानीय उपयोगकर्ता का था।

मंद्रिव 2009 होस्ट GNOME 2.28 वातावरण का उपयोग करते हैं, 2010.2 मेजबान GNOME 2.32 का उपयोग करते हैं, 2011 होस्ट KDE प्लाज्मा का उपयोग करते हैं और Ubuntu 11.04 होस्ट यूनिटी का उपयोग करते हैं।


अपडेट करें

जैसा कि मैंने इस प्रश्न में उल्लेख किया है , मैंने इसके polkitतहत /usr/share/polkit-1/actions/(फ़ाइल में org.freedesktop.consolekit.policy) एक क्रिया को देखा है और एक कार्रवाई को बुलाया org.freedesktop.consolekit.system.stop-multiple-usersहै जो संदेश को फेंकता है

System policy prevents stopping the system when other users are logged in

मैं सोच रहा हूं ( org.freedesktop.*नामकरण सम्मेलन के कारण ) कि यह डी-बस के माध्यम से डीएम को भेजा गया संकेत है। मुझे लगता है कि अगर मुझे पता चल सकता है कि क्या संकेत इस polkitक्रिया को ट्रिगर करता है, तो मुझे इसके व्यवहार को संशोधित करने में सक्षम होना चाहिए। कोई विचार?


अपडेट २

मैंने आज थोड़ा प्रयोग करने की कोशिश की और इसने मुझे बहुत अजीब परिणाम दिए। मैंने SSH के माध्यम से एक बॉक्स में लॉग इन करने की कोशिश की और यह सुनिश्चित किया कि कोई अन्य उपयोगकर्ता किसी भी वीटी पर लॉग इन नहीं हुआ था। यदि मैं ShutdownGDM के "कार्य" मेनू से चुनता हूं , तो मुझे लंबे समय से प्रतीक्षित नीति संदेश मिलता है जो मुझे सूचित करता है कि प्रमाणीकरण के बिना ऐसा करना असंभव है क्योंकि अन्य उपयोगकर्ता लॉग इन हैं। हालांकि , अगर मैं स्थानीय रूप से लॉग इन करने के लिए जीडीएम का उपयोग करता हूं और चुनता हूं । गनोम के मेनू से बॉक्स को बंद करने के लिए, SSH सत्र पहले की तरह ही बंद रहता है। यह कैसे हो सकता है? क्या व्यवहार अलग है जब मैं shutdownGDM से अनुरोध करता हूं जब मैं इसे भीतर से आरंभ करता हूं gnome-session? क्या वह किसी को कुछ भी बताता है जो मुझे समस्या को हल करने में मदद कर सकता है?


यह संभवत: मदद करेगा यदि आप कुछ संकेत दे सकते हैं कि आप किस ओएस पर चल रहे हैं।
जेनी डी

नेटवर्क पर 4 ओएस हैं: मैनड्रिव 2009, मैनड्रिव 2010.2, मैंड्रिवा 2011 और उबंटू 11.04। मुझे नहीं पता था कि यह ओएस-विशिष्ट था; मेरे सवाल का संपादन ...
जोसेफ़ आर।

2
मुझे लगता है कि यह SSH के साथ ओएस के साथ करना अधिक है। यह कुछ ऐसा नहीं है जिसे मैंने यूनिक्स में चलाए जाने के खिलाफ चलाया है; लेकिन फिर, मैं आमतौर पर रूट के रूप में शटडाउन करता हूं।
जेनी डी

@ जेनीडी: यूआई के माध्यम से उपयोगकर्ताओं को बंद करने से रोकने के लिए एक समाधान हो सकता है; लेकिन मुझे लगता है कि यह उनके लिए कष्टप्रद होगा।
जोसेफ आर।

2
SSH के साथ एक समस्या होने के बजाय, यह PAM के कॉन्फ़िगरेशन (होस्ट के बंद होने पर) के साथ एक समस्या हो सकती है। क्या आपने देखा है कि PAM लॉग-इन उपयोगकर्ताओं को शटडाउन निर्धारित करने में कैसे मदद कर सकता है और सिस्टम को बंद करने के लिए देख रहे उपयोगकर्ता को समान चेतावनी प्रदान करता है?
रोब गिब्सन

जवाबों:


3

मैं एक छोटा सा प्रोग्राम लिखूंगा जो किसी भी सक्रिय SSH कनेक्शन के माध्यम से netstatऔर / या के लिए जाँच करता है ps। इसे shutdownकमांड के स्थान पर छोड़ें ।

यदि कोई अन्य व्यक्ति मशीन का उपयोग नहीं कर रहा है, shutdownतो उपयोगकर्ता द्वारा प्रयास करने पर कॉल करें । यदि कोई मशीन का उपयोग कर रहा है, तो बस shutdownकमांड जारी करने वाले उपयोगकर्ता को चेतावनी दें ।

Netstat आपको इस तरह से आउटपुट देगा, और .sshआउटपुट में देखना बहुत आसान है ।

netstat -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        State
tcp        0     52  10.5.6.xx.ssh          10.6.6.yy.51400        ESTABLISHED
tcp        0      0  *.ssh                  *.*                    LISTEN
udp        0      0  *.syslog               *.*

psआपको इस तरह से आउटपुट देगा, लेकिन यह थोड़ा कठिन है क्योंकि आपको यह सुनिश्चित करना होगा कि आउटबाउंड कनेक्शन के बारे में चिंता न करें। Netstatशायद जाने का सही तरीका है।

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd

वास्तव में अच्छा लगता है। मैं सोच रहा हूं कि एसएसएच पीएएम sessionश्रृंखला को बढ़ाने के लिए एक प्रोग्राम है जो एक फाइल को छूता है जब एक उपयोगकर्ता एसएसएच के माध्यम से लॉग इन करता है और जब उपयोगकर्ता लॉग आउट करता है तो उसे हटा देता है और आपके द्वारा सुझाए गए प्रोग्राम को बस अस्तित्व के लिए जाँचें। ये फाइलें। यदि यह काम करता है, तो मैं आपके उत्तर को स्वीकार कर रहा हूं।
जोसेफ आर।

1
वह काम करना चाहिए। एक विचार: क्या होगा अगर वे बिना लॉग आउट किए डिस्कनेक्ट कर दें? अगर SSH सत्र बस मर जाता है तो क्या फ़ाइल को छुआ जाता है? आप यह करता है यह सुनिश्चित करना चाहते हैं
kmort

हममम। यह वास्तव में विचार के लिए भोजन है ...
जोसेफ आर।

1
शायद whoइसके बजाय आउटपुट को पार्स करके आपके दृष्टिकोण को सरल बनाया जा सकता है । यह दिखाता है कि कौन सा उपयोगकर्ता / उपयोगकर्ता जुड़ा हुआ है और किस होस्ट से है।
जोसेफ आर।

1
बहुत संभावना है। जिस शेल का मैं सबसे ज्यादा इस्तेमाल whoकरता हूं , वह ज्यादा आउटपुट नहीं देता है, लेकिन ज्यादातर अन्य गोले ऐसा करते हैं। (सिल्ली एंबेडेड सिस्टम ...) किसी भी मामले में, यदि आप उपयोग करना चाहते हैं, तो आपके netstatलिए आवश्यक कॉलम प्राप्त करना बहुत सरल है awknetstat -a | awk '{print $4}'(कम से कम मेरे खोल पर) की तर्ज पर कुछ
kmort

2

आपको वास्तव में सही जानकारी मिली। कम से कम यह Ubuntu के तहत 13.04 तक काम करता था।

निम्न नीति प्रविष्टि, जब नीचे के रूप में "dif_admin_keep" के साथ सेटअप होता है, तो होने वाले बंद को प्राथमिकता देगा:

<action id="org.freedesktop.consolekit.system.stop-multiple-users">
  <description>Stop the system when multiple users are logged in</description>
  <message>System policy prevents stopping the system when other users are logged in</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>auth_admin_keep</allow_active>
  </defaults>
</action>

लेकिन किसी तरह, 13.10 के बाद से, इस नीति को पूरी तरह से नजरअंदाज कर दिया गया है। इस प्रकार अब तक कोई भी मुझे यह बताने में सक्षम नहीं है कि यह क्या होगा (यदि कुछ भी)।

ध्यान दें कि आपके पास पुनरारंभ के लिए ऐसी प्रविष्टि भी है (org.freedesktop.consolekit.system.restart-multiple-users) जिसे भी सेट किया जाना चाहिए auth_admin_keep

इस सवाल / जवाब को AskUbuntu पर भी देखें: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password


0

SSH कनेक्शनों की गणना करें, और यदि आपकी तुलना में अधिक है, तो बंद करें:

SSH_CONS=$(ps x | grep 'sshd:' | grep -v 'grep' | wc -l)

if [ "$SSH_CONS" -gt 1 ]
then
    echo "More than 1 SSH connection..."
else
    echo "Shutting down..."
    # halt
fi

कुछ इस तरह?

मैं शायद कुछ पढ़े हुए चर डालूंगा ताकि यह मुझे संकेत दे, जैसे "क्या आप वैसे भी बंद करना चाहते हैं?" और "क्या आप शटडाउन करना चाहते हैं?"।

तब आप इसे एक उपनाम या समान के रूप में उपयोग कर सकते हैं।


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