जब अनुमति rwxr-xr-x है तो मैं शटडाउन निष्पादित क्यों नहीं कर सकता?


34

मैं अंदर हूं /sbinऔर मैं देख रहा हूं कि shutdownइसकी अनुमति है rwxr-xr-x। क्या इसका मतलब यह नहीं है कि कोई भी इसे अंजाम दे सकता है?


1
वह कौन सी कमांड है जिसे आपने चलाया था और आपको क्या त्रुटि हुई है?
slayedbylucifer

मुझे लगता है कि वह shutdownकमांड के बारे में बात कर रहा है ।
विंज़

मैं भागा ./shutdown +30 मुझे "शटडाउन: रूट होने की आवश्यकता है"। हालाँकि, यदि अनुमतियाँ कहती हैं कि कोई भी निष्पादित कर सकता है, तो मुझे रूट होने की आवश्यकता क्यों है?
कोरगन रिवेरा

मैं अनुमान लगा रहा हूं, कि कोई भी मशीन को बंद कर सकता है। जीयूआई की तरह ही, कोई भी इसे बंद कर सकता है। लेकिन अगर आप कह रहे हैं कि आपको जड़ होने की जरूरत है, तो मुझे नहीं पता। हालांकि अच्छा सवाल है।
केवदोग K K

4
@ Kevdog777: जीयूआई पॉलिसी पर यह काम करता है। यह रूट विशेषाधिकारों के साथ एक डेमन है जो जांच करेगा कि आपको उपयोग करने की अनुमति है या नहीं shutdown
विंज़

जवाबों:


76

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

आनंद: मैं विशाल गहरे से आत्माओं को बुला सकते हैं।
HOTSPUR: क्यों, इसलिए मैं या कोई भी आदमी कर सकता है; लेकिन क्या वे तब आएंगे जब आप उनके लिए फोन करेंगे?
(हेनरी IV से)

shutdownसे अलग नहीं है /bin/rm। हर कोई इसे निष्पादित कर सकता है, लेकिन एक नियमित उपयोगकर्ता को हटा नहीं सकता है /etc, या किसी अन्य उपयोगकर्ता के घर की निर्देशिका नहीं कर सकता है ।

विशेष रूप से: केवल रूट विशेषाधिकारों (प्रभावी यूआईडी 0) के साथ चलने वाली एक प्रक्रिया इनिट सिस्टम को सिस्टम सेवाओं को रोकने, सभी उपयोगकर्ता प्रक्रियाओं को समाप्त करने और सिस्टम कॉल को जारी करने का निर्देश दे सकती है जो वास्तव में मशीन को रोकती है। (यदि shutdownइसे सेट किया गया था, तो यह जड़ के रूप में चलेगा जो इसे लागू करता है, लेकिन यह नहीं है।)

shutdownGUI से कॉल करने के बारे में क्या , उदाहरण के लिए कंट्रोल-अल्ट-डेल के साथ? यह महसूस करना महत्वपूर्ण है कि उस मामले में, shutdownसीधे द्वारा शुरू किया गया है initऔर यह रूट विशेषाधिकारों के साथ चलता है। तो हर कोई जो कंसोल तक चलता है, संभवतः इसे बंद कर सकता है। यदि यह वांछनीय नहीं है, तो नियंत्रण-ऑल्ट-डिलीट वास्तव में चलेगा shutdown -a। (दस्तावेज़ देखें कि @ some1 ने उनके उत्तर में उद्धृत किया है)। जो यह shutdownजांचने के लिए कहता है कि वर्तमान में लॉग इन उपयोगकर्ता इसे चलाने के लिए अधिकृत है या नहीं। लेकिन यह केवल प्रासंगिक है क्योंकि shutdownइस परिदृश्य में जड़ के रूप में चल रहा है।


2
स्पष्टता: कोई भी कार्यक्रम को निष्पादित कर सकता है shutdown, लेकिन यह कार्यक्रम वास्तव में एक सिस्टम शटडाउन को ट्रिगर नहीं कर सकता है जब तक कि वर्तमान उपयोगकर्ता के पास रूट विशेषाधिकार न हों। सही?
लारश

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

"शटडाउन सेटटूड नहीं है" का क्या मतलब है?
इयान सैमुअल मैकलीन एल्डर

1
@ मुख्य रूप से, प्रोग्राम आम तौर पर उपयोगकर्ता की अनुमति के साथ चलाया जाता है जो उन्हें आमंत्रित करता है। यही हाल इनका भी है shutdown। निष्पादक कार्यक्रम उपयोगकर्ता के परमिट के साथ चलाया जाता है जो निष्पादन योग्य का मालिक होता है। उदाहरण के लिए, /etc/passwdरूट अनुमतियों के साथ आपको पासवर्ड फ़ाइल को संशोधित करने की अनुमति देता है। के लिए मैनपेज देखें chmod
एलेक्सिस

यह " /usr/bin/passwdरूट अनुमतियों के साथ रन " होना चाहिए था ! /etc/passwdनिष्पादन योग्य नहीं है (यह "पासवर्ड फ़ाइल" संशोधित किया जा रहा है)।
एलेक्सिस

15

shutdownयदि आपका UID 0 है, तो बाइनरी स्वयं जाँच करता है।

स्ट्रेस आउटपुट देखें:

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?

4
+1 स्ट्रेस का उपयोग दिखाने के लिए ... यह उपयोगी है। हालाँकि मैं यह नहीं देखता कि यह ट्रेस कैसे दिखाता है shutdownकि आपकी UID 0.
LarsH

1
आप स्ट्रेस आउटपुट में नहीं देखेंगे क्योंकि यह केवल सिस्टम कॉल की रिपोर्ट करता है। आप यह अनुमान लगा सकते हैं कि जब एक गेट्यू में त्रुटि संदेश लिखकर बारीकी से पालन किया जाता है कि कोड समान था if(getuid() != 0) printf("Need to be root");। जो वास्तव में स्रोत कोड से पता चलता है।
msw

5

हाँ ! हर कोई उस कमांड को चला सकता है। जैसा कि आपने कहा, आप इसे चलाने में सक्षम हैं, लेकिन आपको "रूट होने की आवश्यकता" संदेश के साथ सामना करना पड़ रहा है, नहीं permission denied। यह देखने के लिए कि क्या आप रूट हैं या नहीं, shutdownकमांड आपकी जांच करता है UID


-1

ऐसा प्रतीत होता है कि शटडाउन एक्सेस सूची की जांच करेगा यदि आप इसे -a से चिह्नित करते हैं:

ACCESS CONTROL
       shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
       one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user  is  logged
       in  on  one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
       if the file /etc/shutdown.allow is present.  It then compares the login names in that file with the list of people that are logged in on a virtual console
       (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message

       shutdown: no authorized users logged in

       to  the  (physical)  system  console.  The  format  of  /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
       allowed. Currently there is a limit of 32 users in this file.

चूंकि आप वर्तमान में इसे -a फ्लैग के बिना कॉल कर रहे हैं, यह केवल रूट शटडाउन की अनुमति देने के लिए डिफ़ॉल्ट है।

यदि आप चाहते हैं कि अतिरिक्त उपयोगकर्ता कमांड चलाने में सक्षम हों, तो उस फ़ाइल को कॉन्फ़िगर करें और ध्वज का उपयोग करें।

Why can't I execute shutdown when the permission is rwxr-xr-x?

अनुमति बिट्स आवश्यक रूप से उपयोगकर्ता या समूह के आधार पर अभिगम नियंत्रण को बाहर नहीं करते हैं।


-aकमांडलाइन से इसे कॉल करने से कोई फर्क नहीं पड़ेगा: shutdown -aअभी भी रूट अनुमतियों के साथ निष्पादित किया जाना चाहिए (जो initनियंत्रण-ऑल-डेल पर आपूर्ति करता है)।
एलेक्सिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.