'सुडो सु -' बनाम 'सूदो-आई' बनाम 'सूदो / बिन / बाश' - यह कब इस्तेमाल किया जाता है, या यह बिल्कुल मायने रखता है?


254

जब मैं कुछ ऐसा कर रहा होता हूं जिसमें रूट को एक पंक्ति में दर्जनों बार टाइप करना पड़ता है, तो मैं अपने सत्र को रूट सत्र पर स्विच करना पसंद करता हूं। विभिन्न ट्यूटोरियल और निर्देश में मैं इंटरनेट पर इस्तेमाल किया है, मैं देख रहा हूँ sudo su, sudo su -, sudo -iऔर sudo /bin/bashएक रूट सत्र खोलने के लिए इस्तेमाल किया जा रहा है, लेकिन मैं इन और जब बीच या यदि वह अंतर मामलों अंतर पर स्पष्ट नहीं कर रहा हूँ।

क्या कोई मेरे लिए यह स्पष्ट कर सकता है?


11
आप के बारे में पूछना भूल गया sudo -sऔर sudo su
रादु राईडेनु

2
संबंधित: "सु", "
सूडो



3
@ RaduRădeanu जब मैंने प्रश्न में टाइप किया तो मैंने सुझाए गए प्रश्नों की समीक्षा की और उनमें से किसी ने भी मेरे पूर्ण प्रश्न को संबोधित नहीं किया। आपके द्वारा जुड़े सवालों के लिए भी यही सच है। हालाँकि वे मेरे लिए बहुत सी नई जानकारी रखते हैं, और उनके साथ जुड़ने के लिए आपका धन्यवाद करते हैं, मैंने उन्हें उत्तर पुस्तिका के रूप में पूरा नहीं किया, जो नीचे दिए गए अराजकता प्रदान करता है, जो मैं देख रहा था, उसके अनुरूप बहुत अधिक है।
पॉल

जवाबों:


325

इसे समझाने के लिए आपको यह जानना होगा कि कार्यक्रम क्या करते हैं:

  • su- कमांड suका उपयोग किसी अन्य उपयोगकर्ता ( s witch u ser) पर स्विच करने के लिए किया जाता है , लेकिन आप रूट उपयोगकर्ता को बिना किसी पैरामीटर के कमांड को स्विच करके भी स्विच कर सकते हैं। suउपयोगकर्ता के पर्यावरण के लिए आपके द्वारा स्विच किए गए पासवर्ड को टाइप करने के बाद, आपको स्विच करने के लिए उपयोगकर्ता का पासवर्ड पूछता है।
  • sudo- sudoरूट विशेषाधिकारों के साथ एक ही कमांड चलाने के लिए है। लेकिन इसके विपरीत suयह आपको वर्तमान उपयोगकर्ता के पासवर्ड के लिए संकेत देता है। यह उपयोगकर्ता sudoers फ़ाइल में होना चाहिए (या एक समूह जो sudoers फ़ाइल में है)। डिफ़ॉल्ट रूप से, Ubuntu 15 मिनट के लिए आपके पासवर्ड को "याद" करता है, ताकि आपको हर बार अपना पासवर्ड टाइप न करना पड़े।
  • bash- कंप्यूटर के साथ बातचीत करने के लिए एक पाठ-इंटरफ़ेस। लॉगिन, गैर-लॉगिन, इंटरैक्टिव और गैर-इंटरैक्टिव गोले के बीच अंतर को समझना महत्वपूर्ण है:

गोले के प्रकार:

  • लॉगिन शेल : एक लॉगिन शेल आपको सिस्टम में एक निर्दिष्ट उपयोगकर्ता के रूप में लॉग इन करता है, इसके लिए आवश्यक उपयोगकर्ता नाम और पासवर्ड है। जब आप वर्चुअल टर्मिनल में प्रवेश करने के लिए ctrl+ alt+ हिट करते हैं, तो आप F1एक लॉगिन शेल के सफल लॉगिन के बाद प्राप्त करते हैं।
  • गैर-लॉगिन शेल : एक शेल जिसे लॉग-इन किए बिना निष्पादित किया जाता है, इसके लिए आवश्यक वर्तमान में लॉग-इन उपयोगकर्ता है। जब आप एक ग्राफिक टर्मिनल को गनोम में खोलते हैं तो यह एक गैर-लॉगिन शेल होता है।
  • इंटरेक्टिव शेल : एक शेल (लॉगिन या नॉन-लॉगिन) जहां आप इंटरेक्टिव प्रकार या कमांड को बाधित कर सकते हैं। उदाहरण के लिए एक सूक्ति टर्मिनल।
  • गैर-इंटरैक्टिव शेल : ए (उप) शेल जो संभवतः एक स्वचालित प्रक्रिया से चलाया जाता है। आपको न तो इनपुट दिखाई देगा और न ही आउटपुट।

तो मामले हैं:

  • sudo susudoकमांड के साथ कॉल करता है su। बैश को इंटरेक्टिव नॉन-लॉगइन शेल कहा जाता है। तो मार ही अंजाम देता है .bashrc। आप देख सकते हैं कि रूट करने के बाद आप अभी भी उसी डायरेक्टरी में हैं:

    user@host:~$ sudo su
    root@host:/home/user#
  • sudo su -इस बार यह एक लॉगिन शेल है, इसलिए /etc/profile, .profileऔर .bashrcनिष्पादित किया गया है और आप रूट के वातावरण के साथ खुद को रूट के होम डायरेक्टरी में पाएंगे।

  • sudo -iयह लगभग उसी तरह है जैसे sudo su -The -i (आरंभिक लॉगिन का विकल्प) लक्ष्य उपयोगकर्ता के पासवर्ड डेटाबेस प्रविष्टि द्वारा निर्दिष्ट शेल को एक लॉगिन शेल के रूप में चलाता है। इसका मतलब यह है कि लॉगिन-विशिष्ट संसाधन फ़ाइलें जैसे कि .profile, .bashrcया .loginशेल द्वारा पढ़ा और निष्पादित किया जाएगा।

  • sudo /bin/bashइसका मतलब है कि आप sudoकमांड के साथ कॉल करते हैं /bin/bash/bin/bashको गैर-लॉगिन शेल के रूप में शुरू किया जाता है, इसलिए सभी डॉट-फ़ाइलों को निष्पादित नहीं किया जाता है, लेकिन .bashrcकॉलिंग उपयोगकर्ता के पढ़े जाने वाले बैश हैं । आपका वातावरण वैसा ही रहता है। तुम्हारा घर जड़ घर नहीं होगा। तो आप रूट हैं, लेकिन कॉलिंग उपयोगकर्ता के वातावरण में।

  • sudo -s$SHELLचर को पढ़ता है और सामग्री को निष्पादित करता है। यदि $SHELLइसमें शामिल /bin/bashहै sudo /bin/bash(ऊपर देखें)।

चेक:

यह जाँचने के लिए कि आप एक लॉगिन शेल में हैं या नहीं (केवल बैश में काम करता है क्योंकि shoptयह बिल्टिन कमांड है):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

18
बस एक स्पष्टीकरण: sudoएक अनुमति वाले उपयोगकर्ता को कमांडर या अन्य उपयोगकर्ता के रूप में एक कमांड निष्पादित करने की अनुमति देता है । वैसे भी, आपके प्रयास के लिए +1।
राडू रियडेनु

2
@chaos इस उत्कृष्ट उत्तर के लिए धन्यवाद! यह ज्यादातर मेरे सवालों का जवाब देता है, इसलिए मैं आगे बढ़ गया और जवाब दिए गए सवाल को चिह्नित किया, लेकिन मुझे समझ नहीं आ रहा है कि किसी विशेष शेल को चलाने के लिए यह कब वांछनीय है। मैं वास्तव में केवल कमांड लाइन के माध्यम से उबंटू का उपयोग करता हूं और मुझे rootउपयोगकर्ता सत्र खोलने के लिए मेरा सबसे आम उपयोग मिलता है (बनाम उपयोग करते हुए sudo) जब मैं कुछ ऐसा कर रहा हूं जिसके लिए rootविशेषाधिकारों के भारी उपयोग की आवश्यकता होती है , जैसे कि कुछ नया स्थापित करना या एक प्रमुख पुनर्संरचना करना । मैं उपयोग कर रहा हूं sudo /bin/bash, लेकिन जाहिर तौर पर उस विधि में किसी कारण से बुरा रैप होता है जो मुझे समझ में नहीं आता है।
पॉल

2
इसके अलावा, यह कहना अधिक "सही" है कि सु सुपर उपयोगकर्ता के बजाय स्विच उपयोगकर्ता के लिए खड़ा है। यानी एक php स्क्रिप्ट चलाते हैं: su www-data /usr/share/script.php या इंटरेक्टिव शेल का सिर्फ su www-data। लेकिन बिना किसी यूजर नेम के रूट (सुपर यूजर) अकाउंट को स्वीकार कर लिया जाएगा।
ओबिवियन

अराजकता - "shopt -q login_shell && echo 'लॉगइन शेल' || इको 'नो लॉगिन शेल' && ऑपरेटर का अर्थ है कि यदि निकास कोड 0 है तो "अगली कमांड करें" और डबल पाइप ()) का अर्थ है (यदि 0 नहीं है) तो इस कमांड को करें। तो यह मूल रूप से क्या कह रहा है यदि निकास कोड 0 तो "लॉगिन शेल" से बाहर निकलें, यदि बाहर निकलें कोड 1 (असफल) तो "कोई लॉगिन नहीं" गूंज। क्यों नहीं "shopt -q login_shell? Echo $?" $? पूर्ववर्ती आदेश का परिणाम / निकास कोड है। अधिकांश में यदि सभी कार्यक्रम 0 का मतलब सफलता नहीं है, तो 1 या अधिक साधन विफल हो जाते हैं। तो अगर प्रतिध्वनि 0 = सफलता है ...
तिरछा

2
@Paul: sudo -iका सुझाव दिया गया है। यहां पढ़ें: ubuntuforums.org/showthread.php?t=1817402 और यहां: unix.stackexchange.com/questions/98531/…
Marco Sulla

0

भिन्नताओं को देखने के लिए आप विभिन्न वातावरणों में परिणामी वातावरण को चट कर सकते हैं।

आप कुछ महत्वपूर्ण चर में "छोटे" अंतर पा सकते हैं :

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

या ~ / में कुछ अंतर। डॉटफ़ाइल्स हैंडलिंग ( ~/.config)।

$ होम आधारित लॉगफ़ाइल्स ( ~/.xsession.errorsआदि ...) या xauth कुकीज़ ( ~/.Xauthority) जो आदेश उत्पन्न करती हैं, के स्वामित्व पर भी विचार करें ।

इन आदेशों का प्रयास करें:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)

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