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


146

मेरे पास foo.shमेरे होम फोल्डर में एक स्क्रिप्ट है ।

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

-bash: ./foo.sh: Permission denied

जब मैं उपयोग करता हूं sudo ./foo.sh, मुझे मिलता है

sudo: foo.sh: command not found

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

जवाबों:


151

अनुमति नहीं मिली

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

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

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

ls -l foo.sh

... जो फ़ाइल स्वामी, समूह के स्वामी और अन्य सभी के लिए READ, WRITE और EXECUTE अनुमतियों को सूचीबद्ध करेगा, जो फ़ाइल स्वामी या उस समूह का सदस्य नहीं है, जिसके पास फ़ाइल है (जिसे अंतिम अनुमति समूह कभी-कभी संदर्भित किया जाता है) "दुनिया" या "अन्य" के रूप में)

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

$ 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 

मालिक ने पहुंच आरडब्ल्यू को पढ़ा और लिखा है, लेकिन यह दर्शाता है कि निष्पादन योग्य अनुमति गायब है

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 परिणाम का उपयोग नहीं मिला

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

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

PATH पर्यावरण चर में निर्देशिकाओं की एक सूची होती है जो कमांड के लिए खोजी जाती हैं। प्रत्येक उपयोगकर्ता अपनी आवश्यकताओं के अनुसार अपना पैठ चर निर्धारित करता है। यह देखने के लिए कि इसे चलाने के लिए क्या निर्धारित है

env | grep ^PATH

यहाँ ऊपर envकमांड को सामान्य उपयोगकर्ता के रूप में चलाने का कुछ नमूना आउटपुट है और फिर sudo का उपयोग कर रूट उपयोगकर्ता के रूप में

rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

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

ध्यान दें, हालांकि, इसी तरह, इस मामले में PATH गैर-विशेषाधिकार प्राप्त उपयोगकर्ता (rkielty) और सुपर उपयोगकर्ता में निहित निर्देशिकाएं समान नहीं हैं ।

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


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

6
@Rob: तो कैसे एक पड़ता है sudo's PATHउपयोगकर्ता के रूप में एक ही?
टॉम

1
@ रब: मुझे इस बीच एक रास्ता मिल गया है (नीचे मेरा उत्तर देखें)।
टॉम

1
आपको जिस तरह से समझाया गया है वह मुझे पसंद है! धन्यवाद :)
कास्पारोवॉव

1
@ यदि आप safe_path को / etc / sudoers
DennisLi

98

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

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

वास्तव में, कोई इससे बाहर एक उपनाम बना सकता है:

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

( sudoमूल को प्रतिस्थापित करते हुए, उपनाम का नाम देना भी संभव है sudo।)


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

4
मेरा मानना ​​है कि यह command not foundउबंटू डिस्ट्रो में सामने आए मुद्दे का सही और सबसे मानकीकृत समाधान है । धन्यवाद दोस्त।
उमर तारिक

आप अपने को उर्फ जोड़ सकते हैं ./bashrcसत्र के बीच में सहेजने के लिए
जॉर्ज

19

Sudo पर safe_path की जाँच करें

[root@host ~]# 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

धन्यवाद! इससे सूडो के एक रहस्य को सुलझाने में मदद मिली कि वह कमांड नहीं चला सकता।
एवगेनी गोल्डिन

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

5

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

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

इस उत्तर पर एक नज़र डालें कि सॉफ्ट लिंक को किस निर्देशिका में रखा जाए।


2

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

[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ 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

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

ध्यान दें कि सुपरसियर के लिए होम के बाद से मेरे पेट को जोड़ते समय मुझे स्पष्ट होना चाहिए


1

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


1

ऊपर बेहतरीन जवाब हैं। यदि, उन्हें आज़माने के बाद, आपको अभी भी command not foundसंपूर्ण फ़ाइल पथ के साथ फिर से प्रयास करना है:

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