2012-10-21 12 views
105

का उपयोग करते समय कमांड नहीं मिला मेरे पास मेरे घर फ़ोल्डर में foo.sh नामक एक स्क्रिप्ट है।सुडो

जब मैं इस फ़ोल्डर में नेविगेट, और ./foo.sh दर्ज करते हैं, मैं

-bash: ./foo.sh: Permission denied मिलता है।

जब मैं sudo ./foo.sh उपयोग करते हैं, मैं

sudo: foo.sh: command not found मिलता है।

ऐसा क्यों होता है और मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

114

अनुमति जाँच

से इनकार किया है, ताकि एक स्क्रिप्ट फ़ाइल होना आवश्यक है एक निष्पादन योग्य अनुमति बिट सेट चलाने के लिए।

लिनक्स file permissions को पूरी तरह से समझने के लिए आप chmod कमांड के लिए प्रलेखन का अध्ययन कर सकते हैं। chmod, परिवर्तन मोड का संक्षिप्त नाम, एक आदेश है जो फ़ाइल की अनुमति सेटिंग्स को बदलने के लिए उपयोग किया जाता है।

अपने स्थानीय सिस्टम के लिए chmod दस्तावेज़ीकरण को पढ़ने के लिए, कमांड लाइन से man chmod या info chmod चलाएं। एक बार को पढ़ और समझ आप चलाने का उत्पादन समझने में सक्षम होना चाहिए ...

ls -l foo.sh 

... जो पढ़ें सूची जाएगा, फ़ाइल स्वामी, समूह के मालिक और बाकी सब है जो के लिए लिख सकते हैं और अनुमतियाँ निष्पादित फ़ाइल स्वामी या समूह जो करने के लिए फ़ाइल अंतर्गत आता है के एक सदस्य (है कि पिछले अनुमति समूह कभी-कभी "दुनिया" या "अन्य" के रूप में जाना जाता है) नहीं

यहाँ कैसे अनुमति अस्वीकृत त्रुटि निवारण करने के लिए का एक सारांश है आपके मामले में।

$ ls -l foo.sh     # Check file permissions of foo 
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh 
    ^^^ 
^^^ | ^^^ ^^^^^^^ ^^^^^ 
    | | |  |  | 
Owner| World |  | 
    |   | Name of 
    Group  |  Group 
      Name of 
       Owner 

मालिक पढ़ सकते हैं और पहुँच rw लिखने लेकिन है - इंगित करता है कि निष्पादन योग्य अनुमति

chmod आदेश फिक्स कि याद आ रही है। (समूह और अन्य केवल पढ़ने के लिए अनुमति फ़ाइल पर सेट है, वे इसे करने के लिए नहीं लिख सकते हैं या यह निष्पादित कर सकते हैं)

$ chmod +x foo.sh    # The owner can set the executable permission on foo.sh 
$ ls -l foo.sh     # Now we see an x after the rw 
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh 
^^^

foo.sh जहाँ तक लिनक्स का सवाल है अब निष्पादन योग्य है।

कमान में sudo परिणाम का उपयोग करना

नहीं मिला जब आप sudo आप प्रभावी रूप से सुपर उपयोगकर्ता या रूट के रूप में यह चल रहे हैं का उपयोग कर एक आदेश चला।

कारण यह है कि मूल प्रयोक्ता अपने आदेश नहीं मिल रहा है संभावना है कि जड़ के लिए PATH वातावरण चर निर्देशिका जहां foo.sh स्थित है को शामिल नहीं करता है। इसलिए आदेश नहीं मिला है।

PATH पर्यावरण चर में निर्देशिकाओं की एक सूची है जो कमांड के लिए खोज की जाती है। प्रत्येक उपयोगकर्ता अपनी जरूरतों के हिसाब से अपने स्वयं के पैथ चर सेट करता है। देखने के लिए यह क्या है,

env | grep ^PATH 

चलाने के लिए सेट यहाँ sudo का उपयोग कर

[email protected]:~$ env | grep ^PATH 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

[email protected]:~$ sudo env | grep ^PATH 
[sudo] password for rkielty: 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin 

ध्यान दें कि जड़ उपयोगकर्ता के रूप में पहले एक साधारण उपयोगकर्ता के रूप में और फिर ऊपर env आदेश चलाने का कुछ नमूना उत्पादन है है, हालांकि इसी तरह, इस मामले में PATH में निहित निर्देशिका गैर-विशेषाधिकार प्राप्त उपयोगकर्ता (rkielty) और सुपर उपयोगकर्ता समान नहीं हैं।

निर्देशिका जहां foo.sh रहता है रूट उपयोगकर्ता के PATH चर में मौजूद नहीं है, इसलिए कमांड त्रुटि नहीं मिली है।

+0

अजीब है कि 'sudo $ PWD/temp.sh' न तो काम नहीं करता है, जबकि 'sudo echo $ PWD' दिखाता है कि मैंने जो इंतजार किया था। (मैक) – Nakilon

+0

@ नाकिलॉन यदि आप इसे पूर्ण विवरण के साथ एक प्रश्न में डालते हैं तो मुझे इसके लिए आपके लिए समस्या निवारण करने में सक्षम होना चाहिए। मुद्दा यह है कि कौन सा खोल (आपका पहला कमांड खोल या सुडो द्वारा लॉन्च किया गया खोल) ने $ PWD –

+0

@RobKielty का मूल्यांकन किया है, कभी भी ध्यान न दें। मुझे सही समस्या याद नहीं है, लेकिन शायद यह स्क्रिप्ट में एक कमांड के लिए chmod -x को सेट करने की तरह smth था, और सुडो के माध्यम से स्क्रिप्ट कॉलिंग इतना समझ में नहीं आया त्रुटि संदेश। – Nakilon

6
  1. जांचें कि आपके पास स्क्रिप्ट पर निष्पादन अनुमति है। i.e. chmod +x foo.sh
  2. जांचें कि उस स्क्रिप्ट की पहली पंक्ति #!/bin/sh या कुछ ऐसे हैं।
  3. सुडो के लिए आप गलत निर्देशिका में हैं। साथ sudo pwd
7

के लिए चेक secure_path sudo पर

[[email protected] ~]# sudo -V | grep 'Value to override' 
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin 

तो $PATH उपयोग visudo अधिरोहित और संपादित किया जा रहा है /etc/sudoers

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

धन्यवाद! इससे सूडो के एक रहस्य को हल करने में मदद मिली जो आज्ञाओं को चलाने में सक्षम नहीं था। –

57

अन्य समाधान मैं यहाँ देखा है अब तक कुछ सिस्टम पर आधारित हैं परिभाषाएं, लेकिन वास्तव में यह संभव है कि sudo वर्तमान PATH (env कमांड के साथ) और/या (-E विकल्प के साथ) पर्यावरण के बाकी सिर्फ यह सही लागू द्वारा: (

alias mysudo='sudo -E env "PATH=$PATH"' 

यह भी संभव है नाम के लिए:

sudo -E env "PATH=$PATH" <command> [arguments] 

वास्तव में, एक इसे से बाहर एक उपनाम बना सकते हैं मूल sudo, मूल sudo को प्रतिस्थापित कर रहा है।)

+3

मुझे यह समाधान पसंद है, टॉम, क्योंकि आप जानबूझकर एक अलग सूडो आमंत्रण के साथ काम कर रहे हैं। यह ध्यान रखना महत्वपूर्ण है कि पीएटीएच वैरिएबल किस तरह से उपयोग में है (और बहुत सारे हैं) इसे स्थापित किया गया है। –

+2

मेरा मानना ​​है कि यह उबंटू डिस्ट्रो में 'कमांड नहीं मिला' मुद्दा के लिए सही और सबसे मानकीकृत समाधान है। धन्यवाद दोस्त। –

1

ऐसा लगता है कि लिनक्स "कमांड नहीं मिला" कहेंगे, भले ही आप फ़ाइल को स्पष्ट रूप से पथ दें।

[[email protected] ~]$ sudo /tmp/uid.sh;echo $? 
sudo: /tmp/uid.sh: command not found 
1 
[[email protected] ~]$ chmod +x /tmp/uid.sh 
[[email protected] ~]$ sudo /tmp/uid.sh;echo $? 
0 

यह कुछ हद तक भ्रामक त्रुटि है, हालांकि यह शायद तकनीकी रूप से सही है। फ़ाइल निष्पादन योग्य होने तक कमांड नहीं है, और इसलिए नहीं मिल सका।

1

ठीक है यह मेरा समाधान है: ~ /।bash_aliases बस निम्नलिखित जोड़ें:

# ADDS MY PATH WHEN SET AS ROOT 
if [ $(id -u) = "0" ]; then 
    export PATH=$PATH:/home/your_user/bin 
fi 

वोला! अब आप अपनी खुद की स्क्रिप्ट को सुडो के साथ निष्पादित कर सकते हैं या निर्यात के बिना रूट के रूप में सेट कर सकते हैं PATH = $ PATH:/home/your_user/bin हर बार।

सूचना है कि मैं जब सुपर उपयोगकर्ता के लिए घर से मेरे पथ को जोड़ने स्पष्ट करने की आवश्यकता है/जड़ है

2

तुम भी सुपर उपयोगकर्ता में निर्देशिका में से एक (उदाहरण के लिए /usr/local/bin) में अपनी स्क्रिप्ट के लिए एक नरम लिंक बना सकते हैं पथ। यह तब सुडो के लिए उपलब्ध होगा।

chmod +x foo.sh 
sudo ln -s path-to-foo.sh /usr/local/bin/foo 

एक विचार है जो निर्देशिका की में नरम लिंक डाल करने के लिए this answer पर एक नज़र डालें।

0

chmod u+x foo.sh बजाय chmod +x foo.sh प्रयास करें यदि आप ऊपर गाइड के साथ परेशानी है। यह मेरे लिए काम करता था जब अन्य समाधान नहीं थे।

संबंधित मुद्दे