कैसे `sudo` बनाने के लिए $ PATH संरक्षित करें?


123

मुझे / ऑप्ट / देवी / sbin (एक कस्टम निर्देशिका) पर स्थापित प्रोग्राम चलाने की आवश्यकता है। अगर मैं उस निर्देशिका को अपने PATH में जोड़ता हूं, तो मेरी .bashrc फ़ाइल में निम्न पंक्ति जोड़कर

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

तब मैं कमांड को ठीक चलाने की कोशिश कर सकता हूं (सिवाय इसके कि यह विफल हो जाता है क्योंकि इसमें sudo की जरूरत होती है)। हालांकि, जब मैं sudo का उपयोग करने की कोशिश करता हूं:

sudo godi_console

मुझे निम्नलिखित त्रुटि मिलती है

sudo: godi_console: command not found

Sudo का उपयोग करने के बाद PATH वैरिएबल का निरीक्षण करने से पता चलता है कि इसका वही PATH शामिल नहीं है जो मेरे पास एक सामान्य उपयोगकर्ता के रूप में है:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PATH समान क्यों नहीं है? क्या मुझसे कुछ ग़लत हो रहा है? मैं डेबियन जेसी पर हूँ और दुर्भाग्य से मुझे इस मुद्दे के आसपास नहीं मिल सकता है sudo को Godi_console के लिए पूर्ण लिंक से गुजारें क्योंकि Godi_console खुद भी PATH के सही रूप से सेट होने पर निर्भर करता है।


2
कोशिश करो sudo -E godi_console-E"पर्यावरण को संरक्षित करें"।
D_Bye

5
@D_Bye, यह काम नहीं करेगा अगर secure_pathऔर / या env_reset कॉन्फ़िगर किया गया हो जैसे कि sudoडेबियन पर कई तैनाती में मामला है ।
स्टीफन चेजलस

@StephaneChazelas जानकारी के लिए धन्यवाद - मैं डेबियन का उपयोग नहीं करता हूं, इसलिए शायद मुझे चुप रहना चाहिए!
D_Bye


एक संबंधित प्रश्न, के बारे में suनहीं है sudo, unix.stackexchange.com/questions/460478 है
JdeBP

जवाबों:


149

आप हमेशा ऐसा कर सकते हैं:

sudo env "PATH=$PATH" godi_console

डेबियन पर एक सुरक्षा उपाय के रूप में, /etc/sudoersहै secure_pathविकल्प के लिए एक सुरक्षित मान पर सेट।

ध्यान दें कि:

sudo "PATH=$PATH" godi_console

जहाँ अपने आप में पर्यावरण चर असाइनमेंट के रूप sudoमें =वर्णों वाले प्रमुख तर्कों का व्यवहार किया जाता है, यह आपके वातावरण में आपके (विरोध के अनुसार ) चलने के godi_consoleसाथ काम भी करेगा , लेकिन निष्पादन योग्य के लिए खोज पथ को प्रभावित नहीं करेगा , इसलिए इसे खोजने में मदद नहीं मिलेगी । $PATHsecure_pathsudosudogodi_console


5
मुझे यह उत्तर सबसे अच्छा लगता है क्योंकि यह विश्व स्तर पर सेटिंग्स को बदलने से बचता है (यानी कम से कम विशेषाधिकार के सिद्धांत को बरकरार रखता है)
अलोइस महदाल

5
sudo "PATH=$PATH" godi_console CentOs7 में काम नहीं किया। आवश्यकता है
हवन बाबा

1
@ स्टीफनचेज़ेलस क्या sudo "PATH=$PATH" godi_consoleवास्तव में काम करता है? तर्क को sudoस्वीकार करता VAR=valueहै, इससे चलने वाले कमांड के वातावरण को प्रभावित करता है, लेकिन इसके विपरीत envया bash, sudoयह इस आदेश को कैसे प्रभावित करता है, इसे प्रभावित नहीं होने देता है । मैंने केवल (हाल ही में) उबंटू 16.04 पर इसका परीक्षण किया। लेकिन मैंने exempt_groupविकल्प को जोड़ने की कोशिश की sudoers(सिर्फ परीक्षण के लिए - मैं इसे एक समाधान नहीं मानता!) और परिणाम रोशन कर रहे थे। फॉर्म के कमांडरों PATH="$PATH" sudo some-commandने काम करना शुरू कर दिया, लेकिन फॉर्म के लोग sudo PATH="$PATH" some-command अभी भी नहीं आए।
एलियाह कगन

2
@ballsatballsdotballs। जैसा कि उपनाम आपके इंटरेक्टिव गोले को प्रभावित करता है, जो अपेक्षाकृत हानिरहित होना चाहिए।
स्टीफन चेज़लस

2
मैं इस प्रकार के मामलों के लिए सिर्फ एक उपनाम बनाता हूं, जहां: उर्फ ​​psudo = "sudo env \" PATH = $ PATH \ "। फिर मेरा सामान्य सूडो उपयोग अप्रभावित है।
माइकट्रॉनिक्स

46

आप डिफ़ॉल्ट PATH पर भी सेट कर सकते हैं /etc/sudoers

फ़ाइल का उपयोग कर संपादित करें visudo

और लाइन को कभी भी अपनी इच्छानुसार अपडेट करें: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin


18

SUDO डिफ़ॉल्ट रूप से env चर रीसेट कर रहा है।

Env_reset नामक इसके मैनुअल और विकल्प की जाँच करें।

आपको बस इसे / etc / sudoers में अक्षम करना होगा।


5
ठंडा! उबंटू में आप सिक्योर_पैथ और env_reset लाइन्स को विडो और कमेंट कर सकते हैं। सिस्टम को काफी कम सुरक्षित बनाता है, इसलिए सावधान रहें।
रावेरबैग

अक्षम करने से env_resetऐसा प्रतीत नहीं होता है कि वे sudoW / r / t PATH के व्यवहार को प्रभावित नहीं करते हैं ।
ज़न्ना

5

यह काम :

sudo $(which your_command)

उदाहरण मेरी gpsस्क्रिप्ट जो एनवीडिया जीपीयू की प्रक्रियाओं को सूचीबद्ध करता है:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

स्पष्टीकरण:

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x

3
sudo --preserve-env=PATH env [command]

यह मेरे अंत पर safe_path को दिखाता है


1

यह काम किया:

sudo "PATH=$PATH" [your command]

अपने पथ मूल्य के साथ $ PATH को न बदलें, आप बस इसे इस तरह से लिखते हैं

उदाहरण: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....


0

शायद ठीक नहीं है जो ओपी के लिए पूछता है, लेकिन यह मदद कर सकता है:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

यह sudoed कमांड के अंदर PATH को बदल देता है ।

संपादित करें: मुझे यकीन नहीं है कि मैं इसका क्या मतलब था, जैसा कि ऊपर बहुत ज्यादा बकवास है। इसके बजाय निम्नलिखित का उपयोग करें:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.