sudo का उपयोग करते समय कमांड नहीं मिला


52

साइट पर कुछ सवाल हैं जो मेरी समस्या से संबंधित हैं, लेकिन मुझे उनमें से किसी में भी समाधान नहीं मिला।

मेरा ऑपरेटिंग सिस्टम Ubuntu 12.04 है। मैंने mvnस्थापित किया है /tools/noarch/apache-maven-3.1.1और मैंने अपने अंत में निम्नलिखित पंक्तियाँ जोड़ी हैं /etc/profile:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

उसके बाद मैं अमल करता हूं source /etc/profile

अब मेरी समस्या यह है: जब मैं चलाता हूं mvn --versionतो कमांड सफल होता है और mvnनिष्पादन योग्य पाया जाता है, जबकि अगर मैं निष्पादित करता sudo mvn --versionहूं : मुझे आउटपुट मिलता है sudo: mvn: command not found:। मुझे पता है कि PATHजब मैं इसके साथ एक कमांड निष्पादित करता हूं तो यह अलग हो सकता है sudoऔर यही कारण है कि मैंने यह कोशिश की:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

एक और चीज मैंने कोशिश की है sudo su -और फिर निष्पादित करना है mvn --version। इस मामले mvnमें सफलतापूर्वक पाया जाता है और कमांड सफल होता है। यहाँ क्या हो रहा है?


जवाबों:


37

$PATH आपके शेल द्वारा मूल्यांकन किया जाता है, इसलिए आपका चेक काम नहीं करता है जैसा कि आप इसकी अपेक्षा करते हैं।

/etc/sudoersPATHएक डिफ़ॉल्ट के साथ अपने को बदलने के लिए कॉन्फ़िगर किया गया है ।

sudoतो डिफ़ॉल्ट रूप से, आदेश को क्रियान्वित करने से पहले एक लॉगिन खोल पर्यावरण लोड नहीं करता है PATHसे /etc/sudoersप्रयोग किया जाता है। su -एक लॉगिन शेल खोलता है, जिसमें लोडिंग शामिल है /etc/profile। देखें man bash, इनवॉइस अनुभाग ।

में PATHरीसेट को हटा दें /etc/sudoers। यह संभवतः एक नियम कहलाता है secure_path


CentOS

CentOS में आप जोड़ सकते हैं PATHकरने के लिए Defaults env_keepअनुभाग:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"

जवाब के लिए धन्यवाद। यह समस्या को हल करता है, लेकिन मैं अन्य दो उत्तरों में समाधान के सुझाव को प्राथमिकता देता हूं क्योंकि यह केवल मैवेन के लिए परिवर्तन करता है, मेरे पैट में सभी आदेशों के लिए नहीं।
izomorphius

FYI करें: कृपया मेरे उत्तर अपडेट पर ध्यान दें।
क्रायगैक्स

कैसे सूद मौजूदा निर्देशिका में बायनेरिज़ निष्पादित करने के लिए sudo: ./<some_binary>: command not found। मैं आर्क लिनक्स का उपयोग कर रहा हूं।
नेकटावी

47

sudoअपने वर्तमान के PATHसाथ दें :

sudo env "PATH=$PATH" your_command

एक शानदार उत्तर, जिसमें किसी भी सेटिंग को संशोधित करने की आवश्यकता नहीं होती है, जिससे कॉलर को वह सब कुछ करना पड़ता है जो आवश्यक है। मैं -Eबाकी पर्यावरण को संरक्षित करने के अलावा, विकल्प का उपयोग करूंगा । वास्तव में, यह इतना आसान है कि इसे आसान उपयोग के लिए स्क्रिप्ट / उपनाम / फ़ंक्शन में रखा जा सकता है। मैं इसे एक अलग उत्तर के रूप में जोड़ दूंगा - लेकिन यश @ @ुपेट करने के लिए!
टॉम

जब मैं इस कमांड को चलाने की कोशिश करता हूं, तो मुझे लगता है env: cmd: No such file or directory- ऐसा कोई विचार क्यों?
एंडी

2
@ और अपने वास्तविक कमांड के साथ cmd को बदलें।
opyate

कैसे सूद मौजूदा निर्देशिका में बायनेरिज़ निष्पादित करने के लिए sudo: ./<some_binary>: command not found। मैं आर्क लिनक्स का उपयोग कर रहा हूं।
नेकटविली

12

@ Opyate के उत्तर पर विस्तार से, मैं निम्नलिखित शेल स्क्रिप्ट का उपयोग कर रहा हूं (जिसका नाम दिया जा सकता है mysudo, उदाहरण के लिए):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Esudoपर्यावरण को संरक्षित करने के लिए कहता है।
  • env "PATH=$PATH"बाहर का विस्तार होता है sudoकॉल, बाहरी बनाने PATHउपलब्ध अंदर sudoभी (इस के अलावा आवश्यक है -Eके रूप में PATHआमतौर पर इलाज के पूरे वातावरण को प्राप्त करता है के अलावा विशेष उपचार प्राप्त करता है)।
  • "$@"हमारी स्क्रिप्ट को मिलने वाली दलीलें sudoलाइन को देती हैं।

एक निर्देशिका में एक फ़ाइल में स्क्रिप्ट को सहेजें PATH, इसे +xअनुमति दें, et voilà।


यह उन लोगों के लिए एक बेहतर समाधान है जो किसी भी मौजूदा फाइल को संपादित नहीं करना चाहते हैं।
qaisjp

4

चूंकि वर्तमान उत्तर थोड़े अस्पष्ट हैं, इसलिए /etc/sudoersआपका पथ बदलने में विशिष्ट सेटिंग है secure_path:

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

आप इसे संशोधित कर सकते हैं sudo visudo, या बेहतर अभी तक, उन निर्देशिकाओं को जोड़ सकते हैं जिनकी आपको आवश्यकता है:

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

2

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

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

चार फ़ाइलों के लिए:

/root/.bashrc
/root/.profile

और वर्तमान उपयोगकर्ता के लिए ( mehranमेरा Ubuntu उपयोगकर्ता नाम है):

/home/mehran/.bashrc
/home/mehran/.profile

1

आपको रूट के पैट वैरिएबल को ठीक वैसे ही संशोधित करना होगा जैसे आपने अपने लिए किया था, अर्थात सुडो की प्रोफाइल में उन दो पंक्तियों को जोड़कर, जो /root/.bashrc में स्थित है, फिर उसे स्रोत करें।


1
मैंने /root/.bashrc को संपादित किया है, लेकिन इसे स्रोत करने में सक्षम नहीं है: sudo source /root/.bashrcहो जाता है: sudo: source: command not foundऔर बिना sudoमुझे अनुमति के इनकार कर दिया जाता है (जैसा कि अपेक्षित है)। मेरा मानना ​​है कि सिद्धांत में एक नया टर्मिनल शुरू करना चाहिए जो स्रोत के समान है, लेकिन एक नया टर्मिनल शुरू करने के बाद sudo mvn --versionभी कुछ भी नहीं मिलता है।
izomorphius

@izomorphius आप स्रोत स्रोत नहीं कर सकते। आपको पहले sudo को कमांड sudo su के साथ स्विच करना होगा , फिर आप फ़ाइल को प्रश्न में स्रोत बना सकते हैं। इसे करने का कोई और तरीका नहीं है।
मारियसमैटुटिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.