सूडो बनाम जड़; कोई वास्तविक अंतर?


44

मैं एक उत्पाद के लिए एक समर्थन सदस्य के साथ काम कर रहा हूं, और वह जोर देकर कहता है कि मुझे पैच की एक श्रृंखला स्थापित करने के लिए रूट होने की आवश्यकता है, और यह कि सूडो काम नहीं करेगा; वह एक कारण प्रदान नहीं करता है लेकिन अपने विश्वासों में बहुत दृढ़ है। ब्राउज़िंग सुपरसुअर मैं इस मामले के होने के किसी भी संभावित कारण का निर्धारण नहीं कर सकता, और पुष्टि में, जब मैं दौड़ता हूं:

sudo -l

मुझे मिला:

...
User [MY USERNAME] may run the following commands on this host:
    (ALL) ALL

वास्तव में रूट होने के लिए लिनक्स / सर्वर टीम से पहुंच प्राप्त करना एक imediate प्रक्रिया नहीं है जैसा कि मैं समझता हूं, इसलिए मैं उन्हें स्वयं स्थापित करना पसंद करूंगा।

क्या कोई भी व्यावहारिक कारण है कि क्यों sudo सर्वर पर सॉफ़्टवेयर स्थापित करने के लिए रूट की तुलना में अलग व्यवहार करेगा?


2
मुझे लगता है कि आपको उसे वापस फेंक देना चाहिए। जैसा कि अन्य लोगों ने दिखाया है, सुडो का उपयोग करके रूट हासिल करने के तरीके के असंख्य हैं और यदि वह आपको ठोस कारण नहीं दे सकता है कि सूडो अपर्याप्त क्यों है, तो उसके पास खड़े होने के लिए कोई पैर नहीं है।
गैरेट

1
पर्यावरण और उप-क्षेत्र दिमाग में आते हैं। मुझे लगता है कि हस्तूर ने पर्यावरण के साथ एक अच्छा काम किया है, और जेएन ने सबकोकैंड्स, पाइपिंग और पुनर्निर्देशन के साथ गू काम किया।
jww

2
गैरेट के पास एक अच्छा बिंदु है, लेकिन इससे पहले कि मैं एक संभावित पेशाब प्रतियोगिता में शामिल हो जाऊं, मैं समर्थन सदस्य से पूछूंगा: क्या आपने इसे दोनों तरीकों से आज़माया है और क्या यह उन तरीकों में से एक है? हो सकता है कि वह असफलता की राह पर चल पड़ा हो sudoऔर लिपियों के रूप में लिपियाँ वर्तमान में लिखी गई हों। अगर ऐसा है, तो sds 'का उत्तर आपके लिए सबसे अधिक उपयोगी हो सकता है sudo su -:।
jww

जवाबों:


34

यह दृढ़ता से इस बात पर निर्भर करता है कि आप अपने कार्यक्रम को किस तरह से sudoया साथ में बुलाते हैं su
इस पल में जिस सिस्टम पर हूं, जैसे:

                  .bashrc                        
    COMMAND        $HOME   $USER  Env.  $PATH
 1. sudo -i        (root)   root  root  [1]
 2. sudo -s        (USER)   root  USER  /home/${USER}/bin:[1]
 3. sudo /bin/bash (USER)   root  USER  /home/${USER}/bin:[1]  
 4. sudo su        (root)   root  USER  [1]:/usr/games:/usr/local/games  
 5. sudo su -      (root)   root  root  [1] 

जहां [1] = / usr / स्थानीय / sbin: / usr / स्थानीय / बिन: / usr / sbin: / usr / बिन: / sbin: / bin
Env = पर्यावरण चर 1 और 5 के लिए रीसेट होते हैं, जो USER द्वारा US $ में लिए गए हैं 2,3,4।

एक स्क्रिप्ट, या कि एक अलग विकल्प अलग देख सकते हैं के साथ शुरू की है एक कार्यक्रम तो $PATH, $HOME, इसके खोल अलग पढ़ सकते हैं .bashrc, .profileपर्यावरण चर और। यह संबंधित फाइल को पढ़ता है $HOME। प्रत्येक उपयोगकर्ता अपने वातावरण को एक अलग तरीके से संशोधित कर सकता है (चर $PATH, .bashrc, .profile, .bash_profile, alias ...)। विशेष रूप से एक उपयोगकर्ता में निर्देशिकाओं का एक अलग क्रम हो सकता है $PATHऔर, एक परिणाम के रूप में, एक स्क्रिप्ट /home/$USER/binइसके बजाय उदाहरण के लिए रूट से अपेक्षित पथ में एक कमांड निष्पादित कर सकता है ।

आप प्रोग्राम को उसी प्रकार चला सकते हैं sudo -iजैसे आप लॉग इन के साथ रूट किए गए थे su -, लेकिन यदि आप इसे sudo MyCommandया उसके साथ चलाते हैं तो आपके पास अलग व्यवहार हो सकता है su -c MyCommand


से man su:

विवरण भाग में:
वर्तमान वातावरण को नए शेल में पास किया गया है$ PATH का मान सामान्य उपयोगकर्ताओं के लिए / bin: / usr / bin पर रीसेट किया जाता है , या / sbin: / bin: / usr / sbin: / usr / bin के लिए सुपरयुसर
...
विकल्प भाग में:
- -l , --login
एक ऐसा वातावरण प्रदान करता है जैसा कि उपयोगकर्ता को उम्मीद है कि उपयोगकर्ता ने सीधे लॉग इन किया होगा

आदमी से sudo

-i , --login
लॉगिन शेल के रूप में लक्ष्य उपयोगकर्ता के पासवर्ड डेटाबेस प्रविष्टि द्वारा निर्दिष्ट शेल चलाएं। इसका मतलब यह है कि लॉगिन-विशिष्ट संसाधन फ़ाइलों जैसे कि .profile या .login को शेल द्वारा पढ़ा जाएगा। यदि कोई कमांड निर्दिष्ट है, तो इसे शेल के -c विकल्प के माध्यम से निष्पादन के लिए शेल में पास किया जाता है। यदि कोई कमांड निर्दिष्ट नहीं है, तो एक इंटरैक्टिव शेल निष्पादित किया जाता है। sudoशेल चलाने से पहले उस उपयोगकर्ता की होम निर्देशिका में परिवर्तन करने का प्रयास करता है। कमांड एक वातावरण के साथ चलाया जाता है, जिसे एक उपयोगकर्ता लॉग इन के समय प्राप्त करता है । Sudoers में कमांड एनवायरनमेंट सेक्शन (5) मैनुअल डॉक्युमेंट्स -i विकल्प कैसे पर्यावरण को प्रभावित करता है जिसमें कमांड कमांड चलाया जाता है जब sudoers पॉलिसी उपयोग में है।


बहुत बढ़िया जवाब। मैं अभी भी लिनक्स पर एक नौसिखिया हूँ, लेकिन एक और अंतर है कि आप जो कर सकते हैं sudoवह sudoers फ़ाइल में अनुमतियों द्वारा सीमित किया जा सकता है। चीजों को रूट के रूप में करना उन सीमाओं को नहीं करता है? अंतिम ब्लॉक उद्धरण शायद इसका मतलब है, लेकिन अगर मैं सही ढंग से समझूं, तो यह पर्यावरण (या शायद पर्यावरण के कारण?) से परे एक और महत्वपूर्ण अंतर की तरह लगता है।
फिक्सर 1234

23

आप पूर्ण है, तो sudoका उपयोग, आप हो सकता है rootका उपयोग करते हुए sudo su -, तो सुरक्षा बिंदु विवादास्पद है।

वास्तव में, एक कार्यक्रम के रूप में rootऔर एक कार्यक्रम के तहत चला गया के बीच अंतर को समझने का एक तरीका है sudo- getuidबनाम का उपयोग करके geteuid- लेकिन यह एक आकस्मिक चाल है। एक पैच सिस्टम ऐसा क्यों करेगा?


5
बोलते हुए su -, वह उपयोग करना चाह सकता है sudo -iताकि उसके पास वैसा ही वातावरण हो जैसा कि सीधे प्रवेश करते समय होता है।
क्रिस्टियान सियुपिटु

2
यदि आप उदा के साथ भाग लेते हैं तो आप sudo myscriptउस शेल से $ PATH और पर्यावरण चर रखेंगे जिसमें आप हैं। यदि आप अपने साथ sudo -i myscriptचलाते हैं जैसे कि आप रूट के रूप में लॉगिन करते हैं। हमारे _zoo के कॉल्स का
Hastur

1
मुझे लगता है कि यह कहना महत्वपूर्ण है कि पर्यावरणीय चर भी sudoमूल के रूप में लॉग-इन के तहत समान नहीं हो सकते हैं
secretformula

1
@dman.exe: sudo सुपरयुसर डू के लिए खड़ा नहीं है, यह "स्विच यूजर डू" है। su और sudo का उपयोग केवल सुपरयुसर के बजाय किसी भी उपयोगकर्ता पर स्विच करने के लिए किया जा सकता है। इसके अलावा सूडो के बारे में कुछ भी छद्म नहीं है, आप वास्तव में वास्तविक जड़ प्राप्त करते हैं जब सूडो को कुछ भी नहीं चलाया जाता है। ध्यान दें कि sudo का जादू वास्तव में setuid अनुमति बिट से आता है।
रेयान

2
sds, @CharlesDuffy: यह विचार कि सूदो और सु का कारण है geteuid()और getuid()एक दूसरे से अलग होना एक मिथक है। su और sudo दोनों निर्दिष्ट कमांड या शेल को चलाने से पहले लक्ष्य उपयोगकर्ता के वास्तविक और प्रभावी उपयोगकर्ता ID दोनों को बदल देते हैं, केवल बहुत ही असामान्य स्थिति को छोड़कर, जिसे आपने अन्यथा उन्हें व्यवहार करने के लिए स्पष्ट रूप से कॉन्फ़िगर किया है। आप इसे (sudo के लिए) चलाकर sudo id -uऔर sudo id -ru(दोनों शो 0), रीडिंग sudo (8) ( COMMAND EXECUTION के तहत ), या टेस्ट प्रोग्राम लिखकर सत्यापित कर सकते हैं ।

7

कुछ अंतर हैं अगर आपको रूट शेल मिल रहा है, जैसा कि @Hastur द्वारा बताया गया है।

यदि आपको रूट शेल नहीं मिल रहा है, तो अधिक अंतर हैं। समर्थन सदस्य के पास sudo patch -p0 < /root/patch.fileजहां patchरूट के रूप में चलाया जाता है, उन चीजों को करने का प्रयास करने का अनुभव हो सकता है , लेकिन <(किसी फ़ाइल से पाइपिंग) नहीं है।


1
सही: व्यावहारिक दृष्टिकोण अक्सर संकेत प्रदान करता है जो केवल मैन पेजों से स्पॉट करना कठिन होता है। इसी तरह की स्थिति पर काबू पाने के लिए आपको अधिक जिम करना पड़ता है [:-)] जैसे कुछ लिखना sudo /bin/bash -c "./patch -p0 < /root/patch"। इससे भी अधिक नाजुक मामला है जब आप फ़ाइल बनाने के लिए पुनर्निर्देशन का उपयोग करते हैं >। पहले तरीके से आप एक फाइल बनाएंगे जो उपयोगकर्ता के पास होगी यदि आपके पास अंतिम निर्देशिका में लिखने के लिए पर्याप्त अधिकार है। बाद के तरीके से आप रूट के स्वामित्व वाली एक फ़ाइल बनाएंगे ... यूनिक्स के काले पक्ष ;-)
Hastur

1

मैं सूडो एक्सेस का उपयोग करते समय ध्यान देता हूं, एक लॉग फ़ाइल बनाई गई है, हालांकि रूट एक्सेस के माध्यम से सीधे चलने पर ऐसा नहीं होता है।


0

यह निर्भर करता है कि आप कितना बढ़िया अनाज चाहते हैं जो रूट एक्सेस होना चाहिए। यदि आपके पास कई उपयोगकर्ता हैं जो एक सिस्टम पर अलग-अलग कार्य करते हैं तो sudo अधिक आदर्श होगा। एक उदाहरण जिसका मैं अक्सर उपयोग करता हूं वह है एप्लिकेशन या डेटाबेस को पुनरारंभ करने की आवश्यकता। सुरक्षा हमेशा सबसे अच्छा विशेषाधिकार है। मैं समूहों का उपयोग करता हूं और केवल उन समूहों को स्पष्ट कार्य करने की अनुमति देता हूं। इस प्रक्रिया का वर्णन करने वाली एक अच्छी पुस्तक "सूडो मास्टरी: रियल एक्सेस कंट्रोल फॉर रियल पीपल" है। वास्तव में यह सामान्य रूप से सुडो के बारे में एक अच्छी पुस्तक है ...

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