sudo कमांड सोर्स /root/.bashrc नहीं करता है


27

मैंने PATHअपनी /root/.bashrc फ़ाइल में चर के लिए एक कस्टम पथ जोड़ा है

जब मैं करता हूं sudo su; echo $PATH, तो यह प्रविष्टि, '/ पथ / से / कस्टम / डिब्बे' दिखाता है।

लेकिन मैं sudo sh -c 'echo $PATH'यह दिखाता हूं , /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

.Bashrc फ़ाइल में जोड़े गए फ़ोल्डर पथ दिखाई नहीं दे रहे हैं।

क्या sudo कमांड में रूट उपयोगकर्ता के समान वातावरण नहीं है?

sudo  bashrc 

जवाबों:


32

.bashrcबैश की एक कॉन्फ़िगरेशन फ़ाइल है, केवल जब इसे अंतःक्रियात्मक रूप से निष्पादित किया जाता है। यह केवल तब ही लोड होता है जब आप बैश शुरू करते हैं, न कि जब आप कुछ अन्य प्रोग्राम चलाते हैं जैसे कि sh(भले ही बैश को नाम के माध्यम से लागू किया गया हो sh)। और यह केवल तभी लोड किया जाता है जब बैश इंटरैक्टिव होता है, न कि जब यह स्क्रिप्ट या कमांड के साथ निष्पादित होता है -c

sudo sh -c 'echo $PATH'या sudo bash -c 'echo $PATH'एक इंटरैक्टिव शेल का आह्वान नहीं करता है, इसलिए .bashrcशामिल नहीं है।

sudo su; echo $PATHरूट के खोल का एक संवादात्मक उदाहरण चलाता है। यदि वह बैश है, तो ~root/.bashrcलोड किया जाता है। यह स्निपेट echo $PATHएक बार इस इंटरेक्टिव शेल को समाप्त कर देता है, इसलिए इंटरेक्टिव शेल में जो कुछ भी होता है उसका स्निपेट के अंत में प्रिंट करने पर कोई प्रभाव नहीं पड़ता है। लेकिन यदि आप echo $PATHद्वारा शुरू किए गए इंटरेक्टिव शेल के संकेत पर टाइप करते हैं sudo su, तो आप द्वारा निर्धारित मान देखेंगे ~root/.bashrc

चूंकि .bashrcप्रत्येक इंटरेक्टिव शेल में इनवॉइस किया गया है, न कि लॉगिन शेल्स (इंटरेक्टिव लॉगइन शेल द्वारा भी नहीं, जो कि बैश में एक डिजाइन दोष है), यह पर्यावरण चर को परिभाषित करने के लिए गलत जगह है। का प्रयोग करें .bashrcजैसे प्रमुख बाइंडिंग, उपनाम और पूरा सेटिंग्स के रूप में इंटरएक्टिव बैश सेटिंग्स के लिए। : फ़ाइलों को लोड किए गए हैं जब आप प्रवेश में सेट वातावरण चर ~/.pam_environmentया ~/.profile

तो इसके बजाय PATHमें सेट करें , और या तो के साथ एक लॉगिन शेल चलाएं , या स्पष्ट रूप से स्रोत के साथ ।.profile.bashrcsudo -i 'echo $PATH'.profilesudo sh -c '. ~/.profile; echo $PATH'


1
गोले के बारे में कई प्रासंगिक बिंदुओं को संबोधित किया है .... धन्यवाद ....

1
मैं इसे कैसे जोड़ूं .profile? क्या आपका मतलब है /root/.profileया /home/user/.profile? मैंने export PATH=$PATH:/mydirदोनों को जोड़ने की कोशिश की । काम नहीं किया। मैंने बिना कोशिश की export, वह भी काम नहीं किया।
झूठे जेब

@falsePockets क्या काम नहीं किया? आपको एक नया प्रश्न पूछना चाहिए और वास्तव में समझाना चाहिए कि आप क्या कर रहे हैं।
गाइल्स का SO- बुराई पर रोक '22

जिस चीज से काम नहीं चला, ठीक वही काम ओपी करने की कोशिश कर रहा है। मैं अपने सुपरयूज़र के पथ पर एक निर्देशिका जोड़ने की कोशिश कर रहा हूं। मुझे एक नया प्रश्न नहीं पूछना चाहिए, क्योंकि यह प्रश्न इस प्रश्न का दोहराव होगा।
झूठे पॉकेट

@falsePockets लेकिन जाहिर है कि आप सुपरसुअर खाते तक पहुंचने के लिए एक ही काम नहीं कर रहे हैं। और जब से आपने यह नहीं कहा कि आप क्या कर रहे हैं, मैं आपके जवाब में जो पहले से है उसे दोहराने के अलावा आपकी कोई मदद नहीं कर सकता।
गिल्स एसओ- बुराई को रोकें '23

14

को देखो -Eऔर -iविकल्प।

-E: सुरक्षा नीति को इंगित करता है कि उपयोगकर्ता अपने मौजूदा पर्यावरण चर को संरक्षित करना चाहता है। यदि उपयोगकर्ता के पास पर्यावरण को संरक्षित करने की अनुमति नहीं है, तो सुरक्षा नीति में कोई त्रुटि हो सकती है।

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


3

आप कर सकते हैं sudo bash, जो मैनुअल पेज / प्रलेखन bashमें प्रलेखित स्टार्टअप फाइलों को पढ़ता है bash। हालांकि, कृपया ध्यान दें कि यह HOMEपर्यावरण चर को सही ढंग से सेट नहीं कर सकता है। इसे सिस्टम-वाइड bashस्टार्टअप फ़ाइल (में /etc, सटीक स्थान डिस्ट्रो पर निर्भर करता है) में तय किया जा सकता है - परीक्षण करें कि क्या $uid0 है।

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