su vs sudo -s vs sudo -i vs sudo bash


89

निम्नलिखित आदेशों में क्या अंतर है:

su
sudo -s
sudo -i
sudo bash

मुझे पता है कि suमुझे रूट पासवर्ड जानने की आवश्यकता है, और इसके लिए sudoमुझे sudoersफ़ाइल में रहना होगा , लेकिन एक बार निष्पादित होने के बाद क्या अंतर है?

मैं जानता हूँ कि वहाँ के बीच एक अंतर है suऔर sudo -sक्योंकि मेरे घर निर्देशिका है /rootके बाद मैं निष्पादित su, लेकिन मेरे घर निर्देशिका अभी भी है /home/mynameके बाद sudo -s। लेकिन मुझे संदेह है कि यह सिर्फ एक अंतर्निहित अंतर का एक लक्षण है जो मुझे याद आ रहा है।


3
मैं sudo su - इस तरह से उपयोग करना पसंद करता हूं आपको रूट पासवर्ड की आवश्यकता नहीं है, और यह -सुनिश्चित करता है कि होम डायरेक्टरी सही सेट है।
जेन्स टिम्मरमैन

जवाबों:


114

इसके साथ su, आप एक और उपयोगकर्ता बन जाते हैं - मूल रूप से मूल, लेकिन संभावित रूप से दूसरा उपयोगकर्ता। यदि आप कहते हैं su -, तो आपका वातावरण उस उपयोगकर्ता के लॉगिन वातावरण के साथ-साथ बदल जाता है, ताकि आप जो देख रहे हैं वह उस उपयोगकर्ता के रूप में लॉगिंग से अप्रभेद्य हो। ऐसा कोई तरीका नहीं है कि सिस्टम यह बता सके कि जब आप suलॉग इन करते हैं तो उस उपयोगकर्ता के कार्यों से दूसरे उपयोगकर्ता को क्या होता है।

चीजें बहुत अलग हैं sudo:

  • आदेश आप के माध्यम से चलाने sudo पर अमल लक्ष्य उपयोगकर्ता के रूप में - डिफ़ॉल्ट रूप से जड़ है, लेकिन साथ अस्थिर -u- लेकिन यह आदेशों आप इसे माध्यम से चलाने के लॉग करता है, उन्हें अपने उपयोगकर्ता नाम के साथ टैगिंग तो दोष बाद में सौंपा जा सकता है। :)

  • sudoबहुत लचीला है। उदाहरण के लिए, आप दिए गए उपयोगकर्ता या उपयोगकर्ताओं के समूह को चलाने की आज्ञा दे सकते हैं। के साथ su, यह सब या कुछ भी नहीं है।

    यह सुविधा आमतौर पर भूमिकाओं को परिभाषित करने के लिए उपयोग की जाती है। उदाहरण के लिए, आप एक "बैकअप" समूह को चलाने की अनुमति दे सकते हैं dumpऔर tar, जिनमें से प्रत्येक को सिस्टम डिस्क को ठीक से बैकअप लेने के लिए रूट एक्सेस की आवश्यकता होती है।

    मैं यहां इसका उल्लेख करता हूं क्योंकि इसका मतलब है कि आप किसी को sudoविशेषाधिकार sudo -sया sudo bashक्षमताओं के बिना दे सकते हैं । उनके पास केवल अनुमतियाँ हैं जो उन्हें अपना काम करने की आवश्यकता है, जबकि suउनके पास पूरी प्रणाली का संचालन है। आपको इसके साथ सावधान रहना होगा, हालांकि: यदि आप किसी को कहने की क्षमता देते हैं sudo vi, उदाहरण के लिए, वे बाहर से खोल सकते हैं viऔर प्रभावी रूप से उसी शक्ति के साथ हो सकते हैं sudo -s

  • क्योंकि यह sudoer के पासवर्ड को रूट पासवर्ड के बजाय लेता है, sudoकई sudoers के बीच अनुमति को अलग करता है।

    यह एक प्रशासनिक समस्या को हल करता है su, जो यह है कि जब रूट पासवर्ड बदलता है, तो उन सभी को जो इसे उपयोग करने के लिए जानना suथा। sudoसूडोर्स के पासवर्ड को स्वतंत्र रूप से बदलने की अनुमति देता है। वास्तव में, सिस्टम पर रूट उपयोगकर्ता के खाते को पासवर्ड से लॉक करना आम है, जिसमें sudoसभी sysadmin कार्यों को करने के लिए बाध्य किया जाता है sudo। कई विश्वसनीय sudoers के साथ एक बड़े संगठन में, इसका मतलब है कि जब एक sysadmins निकल जाता है, तो आपको रूट पासवर्ड को बदलने और उन प्रवेशकों को वितरित करने की आवश्यकता नहीं है जो बने रहते हैं।

के बीच मुख्य अंतर sudo bashऔर sudo -sवह यह है कि -sकम है और आप कई तरीकों से अपनी उपयोगकर्ता के डिफ़ॉल्ट खोल में निष्पादित करने के लिए आदेशों पारित कर सकते हैं:

  1. आप कह सकते हैं sudo -s some-commandजो some-commandआपके खोल के नीचे चलता है । यह मूल रूप से आशुलिपि है sudo $SHELL -c some-command

  2. आप इसके बजाय शेल के मानक इनपुट के लिए कमांड पास कर सकते हैं, जैसे sudo -s < my-shell-script। बार-बार टाइप करने की आवश्यकता को टालते हुए, आप एक कॉल पर कई कमांड भेजने के लिए इसे हेरेडोक के साथ उपयोग कर सकते हैं ।sudosudo

वे दोनों व्यवहार वैकल्पिक हैं। अधिक सामान्य रूप से, आप -sअकेले देते हैं, इसलिए यह आपके उपयोगकर्ता के शेल को अंतःक्रियात्मक रूप से चलाता है। उस मोड में, यह इस बात से अलग sudo bashहै कि यह एक अलग शेल को चला सकता है bash, क्योंकि यह पहली बार SHELLपर्यावरण चर में दिखता है , और फिर यदि यह परेशान है, तो आपके उपयोगकर्ता के लॉगिन शेल सेटिंग में, आमतौर पर /etc/passwd

आपके द्वारा चलाए जाने वाला शेल sudo -sआपके वर्तमान उपयोगकर्ता वातावरण को इनहेरिट करता है। यदि आप वास्तव में चाहते हैं कि एक स्वच्छ वातावरण है, जैसे आप लॉगिन के बाद प्राप्त करते हैं, तो आप इसके बजाय क्या चाहते हैं sudo -i, अपेक्षाकृत हाल ही में इसके अतिरिक्त है sudo। मोटे तौर पर बोलना है, sudo -iजैसा sudo -sकि su -है su: यह सभी लेकिन कुछ प्रमुख पर्यावरण चर को रीसेट करता है और आपको आपके उपयोगकर्ता के होम डायरेक्टरी में वापस भेजता है। यदि आप इसे मानक इनपुट के माध्यम से उस शेल के नीचे चलाने के लिए कमांड नहीं देते हैं sudo -i some-command, या यह उस शेल को इंटरेक्टिव लॉगिन शेल के रूप में चलाएगा, तो आपके उपयोगकर्ता के शेल स्टार्टअप स्क्रिप्ट (जैसे .bash_profile) फिर से रन हो जाएंगे ।

यह सब की sudo -iतुलना में काफी अधिक सुरक्षित बनाता है sudo -s। क्यों? क्योंकि अगर कोई आपके पर्यावरण को पहले संशोधित sudo -sकर सकता है, तो वे अनपेक्षित आदेशों को निष्पादित करने का कारण बन सकते हैं। सबसे स्पष्ट मामला संशोधित हो रहा है SHELL, लेकिन यह सीधे कम भी हो सकता है, जैसे कि PAGERयदि आप man fooनीचे बोलते हैं तो sudo -s

आप कह सकते हैं, "यदि वे संशोधित PAGERकर सकते हैं PATH, तो वे संशोधित कर सकते हैं , और फिर वे सिर्फ एक बुराई sudoकार्यक्रम का विकल्प चुन सकते हैं ," लेकिन कोई पर्याप्त रूप से पागल /usr/bin/sudo /bin/bashउस जाल से बचने के लिए कह सकता है । आप शायद इतने पागल नहीं हैं कि आप अन्य सभी अतिसंवेदनशील पर्यावरण चर में जाल से बचते हैं , हालांकि। क्या आपने EDITORकोई वीसीएस कमांड चलाने से पहले, उदाहरण के लिए जांचना भी याद रखा ? इस प्रकार sudo -i

क्योंकि sudo -iआपकी कार्यशील निर्देशिका को आपके उपयोगकर्ता की होम निर्देशिका में भी बदल देता है, फिर भी आप sudo -sउन परिस्थितियों के लिए उपयोग करना चाह सकते हैं जहाँ आप जानते हैं कि आप उसी निर्देशिका में बने रहना चाहते हैं cdजब आप भाग रहे थे sudo। यह अभी भी सुरक्षित है sudo -iऔर cdआप कहाँ थे, हालांकि वापस।


2
'शेल आउट ऑफ vi' से आपका क्या तात्पर्य है?
क्रिट्रॉन

11
@ क्रिश्रॉन: भीतर से vi, :shदर्ज करें और दर्ज करें। अब आप एक उप-शेल में हैं, viप्रक्रिया के सभी विशेषाधिकारों के साथ जो उस शेल को जन्म देते हैं। यदि viरूट विशेषाधिकारों के साथ चल रहा है, तो शेल होगा। या, आप शेल के अलावा कुछ और चला सकते हैं :!cmd, एक कमांड से आउटपुट को एडिट बफर में कमांड के माध्यम से पढ़ सकते हैं :r !cmd, आदि। यदि उन सभी को बंद कर दिया गया है, तो Makefileलक्ष्य शेल स्क्रिप्ट हैं, और विम में :makeकमांड है, जो प्रभावी रूप से आपको मनमाना शेल चलाने की सुविधा देता है। संपादक के भीतर से स्क्रिप्ट। शरारत के लिए संभावनाएं इस टिप्पणी बॉक्स के लिए बहुत अधिक हैं।
वॉरेन यंग

2
अगर कोई आपके PATH में बैश लगा सकता है तो कोई आपके PATH में नकली sudo डाल सकता है। यह सुनिश्चित करने के लिए कि आपको पूर्ण पथ का उपयोग करके /usr/bin/sudo
सूडो

1
@ एलस्माना: मैंने एक पते में संबोधित किया है; मूल रूप से, PATHकेवल समस्या नहीं है।
वॉरेन यंग

6
महान व्याख्या; इसे पढ़कर बड़ा सिरदर्द हुआ।
लोबिया

27

एक ubuntuforums पोस्ट से मैंने कुछ समय पहले बनाया था:

निम्नलिखित प्रयोग पर विचार करें:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

यहाँ मुझे मिले अंतर हैं:

के साथ sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

के साथ sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

में अंतर नोटिस $HOME। जड़ और $HOMEसामान्य उपयोगकर्ता के घर में सेट होने के कारण समस्याएं हो सकती हैं। उदाहरण के लिए, यदि आप एक ग्राफिकल ऐप चलाते हैं, तो सामान्य उपयोगकर्ता ~/.Xauthorityरूट द्वारा अधिलेखित हो सकता है। यह बाद में सामान्य उपयोगकर्ता समस्याओं का कारण बनता है जैसे कि क्रोन के माध्यम से कुछ ग्राफिकल एप्लिकेशन को चलाने में सक्षम नहीं होना।

संक्षेप में:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games शायद द्वारा निर्धारित /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

निचली पंक्ति sudo -iको चलाने के लिए उचित कमांड है जब आप एक रूट शेल चाहते हैं जो उपयोगकर्ता के पर्यावरण द्वारा अप्राप्त है।


1
पर्यावरण कितना 'कलंकित' है sudo( /etc/sudoersऔर संबंधित फाइलों के विन्यास) पर भी निर्भर करता है । जैसे विन्यास सेटिंग्स always_set_home, env_reset, env_keep, env_checkऔर env_reset, और इन उपयोगकर्ता और आदेश के आधार पर भिन्न हो सकती है। Sudoers (5) मैनपेज का 'कमांड एनवायरनमेंट' और SUDOERS OPTIONS सेक्शन देखें ।
कर्ट जे। सैम्पसन

व्यक्तिगत रूप से, मैं sudo -Hsतब जाता हूं जब मैं अपनी सेटिंग्स द्वारा एक वातावरण को प्राप्त करना चाहता हूं, क्योंकि मैं zsh का उपयोग करता हूं और सभी एप्लिकेशन खातों को मैं बैश का उपयोग करने के लिए बदल सकता हूं। यह एक निश्चित संख्या में पर्यावरण चर को अनमोल पारित होने देता है, लेकिन मैं आमतौर पर उन चीजों को ढूंढता हूं जो मामला /etc/profile.d/* द्वारा अधिलेखित हो जाते हैं।
एड ग्रिम

7

su( s witch u ser या s ubstitute u ser) आपको उपयोगकर्ता स्विच करने देता है। suमूल रूप से इच्छित उपयोगकर्ता के विशेषाधिकारों के साथ एक और शेल उदाहरण शुरू होता है। डिफ़ॉल्ट रूप से यह आपको rootउपयोगकर्ता के लिए स्विच करता है, यदि हम विशिष्ट उपयोगकर्ता को स्विच करना चाहते हैं, तो हमें निम्नानुसार उपयोगकर्ता को पास करना होगा:

$ su bob  # switches to bob (requires bob's password)

su -इसका मतलब है कि पर्यावरण चर को रूट पर रीसेट किया जाएगा और suपुराने उपयोगकर्ता के रूप में पर्यावरण चर का मतलब होगा।

उदाहरण के लिए: यदि आप उपयोग करते हैं su -या पुराने उपयोगकर्ता होम निर्देशिका का उपयोग करते हैं तो रूट की होम डायरेक्टरी su

sudo ( s uper u ser do ) एक कमांड-लाइन यूटिलिटी है जो उपयोगकर्ताओं को डिफ़ॉल्ट रूप से सुपरयूजर यानी किसी अन्य उपयोगकर्ता के सुरक्षा विशेषाधिकारों के साथ प्रोग्राम चलाने की अनुमति देती है root। यह एक विन्यास फाइल का उपयोग करता है /etc/sudoersजो यह बताता है कि उपयोगकर्ताओं के पास विशिष्ट कार्यों के अधिकार हैं

sudo को / ːsuːdu/ के रूप में पढ़ा जाना चाहिए । वाक्य रचना sudo commandयानी रों डायन यू सेवा और कर इस आदेश।

  • suके बराबर है sudo -iऔर रूट खाते में एक लॉगिन अनुकरण करता है। आपकी वर्किंग डायरेक्टरी होगी /root, और यह रूट .profileआदि को पढ़ेगा । प्रॉम्प्ट $ # से बदल जाएगा, यह दर्शाता है कि आपके पास रूट एक्सेस है।

  • sudo -s एक शेल को रूट के रूप में लॉन्च करता है, लेकिन आपकी कार्यशील निर्देशिका को परिवर्तित नहीं करता है।

  • sudo bashbashसाथ चलने की आज्ञा कहाँ है sudo। यह कमांड bashसुपर यूजर के रूप में चलती है ।

  • का उपयोग करके sudoसब कुछ लॉग इन किया जा सकता है।
  • उपयोग करने sudoसे उपयोगकर्ता को रूट पासवर्ड जानने से रोकता है।
  • sudoहम कमांड का उपयोग करके कमांड को चलाने की अनुमति दे सकते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.