पीटीएच चर सूडो और सु के माध्यम से अलग क्यों होते हैं?


39

अपने फ़ेडोरा वीएम पर, जब मेरे उपयोगकर्ता खाते के साथ चल रहा है, तो मैं /usr/local/binअपने रास्ते में हूँ:

[justin@justin-fedora12 ~]$ env | grep PATH
 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

और इसी तरह दौड़ते समय su:

[justin@justin-fedora12 ~]$ su -
Password: 
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

हालाँकि, जब sudoइस माध्यम से चल रहा है , यह निर्देशिका पथ में नहीं है:

[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin

रास्ते से अलग क्यों हो जाएगा sudo?



जवाबों:


37

देख लेना /etc/sudoers। फेडोरा में डिफ़ॉल्ट फ़ाइल (साथ ही आरएचईएल में, और उबंटू और इसी तरह की) में यह पंक्ति शामिल है:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

जो यह सुनिश्चित करता है कि सूडो के तहत बायनेरिज़ चलाते समय आपका रास्ता साफ हो। यह इस प्रश्न में दी गई कुछ चिंताओं से रक्षा करने में मदद करता है । यदि आपके पास /sbinऔर /usr/sbinअपने रास्ते में नहीं है तो यह सुविधाजनक भी है।


आह, मैं अपनी फ़ाइल में देखता हूँ। तो, नहीं है कि मैं चाहता हूँ, लेकिन अगर मैं जोड़ा /usr/local/binइस निर्देश को तो मैं होगा मेरी राह में यह देखने के लिए जब के माध्यम से चल रहा है sudo, है ना?
जस्टिन एथियर

मैंने बस कोशिश की और अब मैं देखता हूं /usr/local/bin। यह समझाने के लिए बहुत बहुत धन्यवाद!
जस्टिन एथियर

स्क्रिप्ट और बायनेरिज़ के लिए अपने उपयोगकर्ताओं के पथ को जोड़ने के बारे में क्या है, इसलिए आपको पूर्ण पथ लिखने की ज़रूरत नहीं है जब आपको sudoउदाहरण के लिए अपने ~/bin(या जो भी पथ आप उपयोग करते हैं) में एक स्क्रिप्ट के लिए होना चाहिए ? मैंने सिर्फ बदलाव किया है - यह काम करता है, केवल सोचा कि इसके लिए एक फ्लिप पक्ष हो सकता है?
इमानुएल बर्ग

@mattdm हां, उबंटू और साथ ही, मैं वीएम के साथ खेलते समय उबंटू विविड में उस मुद्दे पर आया था। डेबियन के लिए भी ऐसा ही है ।
केनोरब

9

कमांड su -रूट यूजर्स प्रोफाइल को एग्जीक्यूट करेगा और उस यूजर के एनवायरमेंट को लेगा जिसमें पाथ आदि sudoशामिल नहीं है।

यदि आप ऐसा sudoव्यवहार करना चाहते हैं su -तो उस विकल्प का उपयोग करें sudo -i [commandजो उपयोगकर्ता की प्रोफ़ाइल को निष्पादित करेगा

यदि आप ऐसा su -व्यवहार करना चाहते हैं sudoतो हाइफ़न का उपयोग न करें - बस उपयोग करेंsu [command]


2

आप चलाकर क्यों (यह अलग है) जांच सकते हैं sudo sudo -V

लिनक्स रन पर उदाहरण के लिए:

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

नोट: macOS / BSD पर, बस चलाएँ sudo sudo -V:।

कुछ लिनक्स वितरण में डिफ़ॉल्ट सुरक्षा नीति प्लगइन के कारण उपरोक्त सूची प्रतिबंधित है।


यह आगे बताया गया है man sudoers:

यदि secure_pathविकल्प सेट किया गया है, तो इसका मान PATHपर्यावरण चर के लिए उपयोग किया जाएगा ।

secure_path- सुडो से चलने वाले प्रत्येक कमांड के लिए पथ का उपयोग किया जाता है। यदि आप सुडू को चलाने वाले लोगों पर विश्वास नहीं करते हैं तो आपके पास एक सायन PATHपर्यावरण चर है जिसका आप उपयोग करना चाहते हैं।

एक और उपयोग है यदि आप "रूट पथ" को "उपयोगकर्ता पथ" से अलग करना चाहते हैं। exempt_groupविकल्प द्वारा निर्दिष्ट समूह के उपयोगकर्ता इससे प्रभावित नहीं होते हैं secure_path। यह विकल्प डिफ़ॉल्ट रूप से सेट नहीं किया गया है।

यदि ऐसी स्थिति है, तो आप sudo visudoकॉन्फ़िगरेशन फ़ाइल को चलाकर और संपादित करके और अपने को संशोधित करके secure_path(अतिरिक्त पथ को अलग करके :) जोड़ सकते हैं या अपने उपयोगकर्ता को इसमें जोड़ सकते हैं exempt_group(ताकि आप secure_pathविकल्पों से प्रभावित नहीं होंगे )।

या उपयोगकर्ता के PATHअस्थायी पास करने के लिए , आप चला सकते हैं:

sudo env PATH="$PATH" my_command

और आप यह देख सकते हैं कि:

sudo env PATH="$PATH" env | grep ^PATH

इसे भी देखें: कैसे करें sudoबचाव $PATH?


अन्य कारण पर्यावरण के लिए अलग हो सकता है sudo, ऐसा इसलिए है क्योंकि आप env_resetअपनी sudoersफ़ाइल में विकल्प सक्षम कर सकते हैं । यह एक नए, न्यूनतम वातावरण के साथ निष्पादित होने का आदेश देता है।

तो आप अपने उपयोगकर्ता के पर्यावरण चर को संरक्षित करने के env_keepलिए विकल्प ( सुरक्षा कारणों से अनुशंसित नहीं ) का उपयोग कर सकते हैं :

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"

1

अधिकांश लिनक्स में, आप पैकेज प्रबंधन के माध्यम से प्रोग्राम इंस्टॉल करते हैं, और नियमित रूप से अपडेट प्राप्त करते हैं। यदि आप पैकेज प्रबंधन को दरकिनार करते हुए कुछ स्थापित करते हैं तो इसे / usr / लोकल / बिन (उदाहरण के लिए, या ... / sbin, या / ऑप्ट) में स्थापित किया जाएगा और नियमित अपडेट नहीं मिलेगा।

मुझे लगता है इसलिए कार्यक्रमों को सुरक्षित नहीं माना जाता है, और डिफ़ॉल्ट रूप से PATH को जड़ में नहीं डाला जाता है।


+1 - कूल, मैं सोच रहा था कि यह रास्ते में क्यों नहीं था, और यह समझ में आता है। इसके लायक क्या है, मैं इसके साथ खेलने के लिए खरोंच से नोड.जेएस बना रहा था, इसलिए यह समझ में आता है कि इसे वहां क्यों रखा गया था, और sudoडिफ़ॉल्ट रूप से इस निर्देशिका को बाहर क्यों करेगा।
जस्टिन एथियर

@Justin Ethier: ऑफ टॉपिक, लेकिन देखें Bugzilla.redhat.com/show_bug.cgi?id=634911
mattdm

1

मैंने सिर्फ अपने लिए यह कोशिश की है और मैंने आपके द्वारा देखे गए व्यवहार को नहीं देखा है - मेरा मार्ग एक ही रहा है, इसलिए हो सकता है कि आपका sudo कॉन्फ़िगरेशन अलग हो। यदि आप इसे man sudoersआप देखेंगे एक विकल्प बुलाया है secure_pathजो फिर सेट करता है PATH- यह लग रहा है इस विकल्प को सक्षम कर दिया गया हो।


दिलचस्प। यह फेडोरा 12 पर था, इसके लायक क्या है ...
जस्टिन एथियर

1

क्योंकि जब आप उपयोग करते हैं sudo bash, bashतो लॉगिन शेल के रूप में कार्य नहीं करता है। के साथ फिर से प्रयास करें sudo bash -lऔर आपको उसी परिणाम को देखना चाहिए su -

यदि यह सही है, तो में अंतर PATHविन्यास फाइल में निहित है: /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile(इसी क्रम में) एक लॉगिन खोल के लिए, क्रियान्वित कर रहे हैं, जबकि ~/.bashrcएक गैर लॉगिन इंटरैक्टिव खोल के लिए मार डाला है।


0

पुराना सवाल है, मुझे पता है, लेकिन मैं यहां सिर्फ इसलिए लड़खड़ा गया क्योंकि मैं इस सटीक समस्या की जांच कर रहा था।

किसी कारण /usr/local/binसे केवल पेट में होने के कारण जड़ बन गई sudo su -। जब sudo -iयह प्रयोग नहीं था। बेशक अब मुझे पता है कि मैं इसे / etc / sudoers में जोड़ सकता हूं, लेकिन फिर भी यह नहीं बताया कि यह पहले से ही क्यों है su -। PATH का यह हिस्सा कहां से आया?

बहुत खोज और खोज के बाद मुझे जवाब मिला:

'/ Usr / लोकल / बिन' युक्त डिफ़ॉल्ट पथ वास्तव में su (1) में हार्डकोड किया गया है।

इसलिए इस तत्व को चुनने के लिए कोई pam कॉन्फ़िगरेशन, प्रोफ़ाइल, bashrc या कुछ भी जिम्मेदार नहीं था। जब यह suपदभार संभाला था तो यह हमेशा से ही था । और चूंकि sudoयह बिल्कुल भी आह्वान नहीं करता है su, लेकिन इसका स्वयं का विन्यास उपयोग करता है, यह बाद में गायब थाsudo -i

मैंने इसे आरएचईएल 6 और आरएचईएल 7 पर सच पाया। मैंने किसी अन्य संस्करण या वितरण की जाँच नहीं की।


मुझसे यह न पूछें कि मैंने इसे कैसे सत्यापित किया है .. ठीक है, अगर आप जोर देते हैं: मैंने suबाइनरी की एक प्रति को हेक्स-एड किया है , /usr/local/binकुछ और में बदल दिया है और कॉपी को आमंत्रित किया है। मेरे पेट में अब संशोधित स्ट्रिंग शामिल है ... अच्छे बच्चे और गैर-आलसी sysadmins बेशक केवल स्रोत डाउनलोड करें और वहां जांच करें। ;-)
ऑस्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.