चलाएँ ./script.sh बनाम बैश स्क्रिप्ट .sh - अनुमति अस्वीकृत


43

जब मैं दौड़ने की कोशिश करता ./script.shहूं तो मुझे मिल जाता है Permission deniedलेकिन जब मैं दौड़ता हूं तो bash script.shसब ठीक होता है।

मैंने गलत क्या किया?


क्या आप शेबंग लाइन की सामग्री और आउटपुट को शामिल करने के लिए प्रश्न को संपादित कर सकते हैं getfacl script.sh?
एंथोनी जी - मोनिका के लिए न्याय

जवाबों:


49

गलत POSIX अनुमतियाँ

इसका मतलब है कि आपके पास निष्पादित अनुमति बिट के लिए सेट नहीं है script.sh। दौड़ते समय bash script.sh, आपको केवल पढ़ने की अनुमति चाहिए script.sh। देखें कि "bash script.sh" और "./cript.sh" को चलाने में क्या अंतर है? अधिक जानकारी के लिए।

आप इसे चलाकर सत्यापित कर सकते हैं ls -l script.sh

आपको नई बैश प्रक्रिया शुरू करने की आवश्यकता भी नहीं हो सकती है। कई मामलों में, आप बस अपने वर्तमान इंटरैक्टिव शेल में स्क्रिप्ट कमांड को चला source script.shया चला सकते हैं . script.sh। यदि स्क्रिप्ट वर्तमान निर्देशिका को बदल देती है या अन्यथा वर्तमान प्रक्रिया के वातावरण को संशोधित करती है तो आप शायद एक नई बैश प्रक्रिया शुरू करना चाहेंगे।

एक्सेस कंट्रोल लिस्ट

यदि POSIX अनुमति बिट्स सही तरीके से सेट हैं, तो एक्सेस कंट्रोल लिस्ट (ACL) आपको या आपके समूह को फ़ाइल को निष्पादित करने से रोकने के लिए कॉन्फ़िगर किया गया हो सकता है। उदाहरण के लिए POSIX अनुमतियाँ इंगित करेंगी कि परीक्षण शैल स्क्रिप्ट निष्पादन योग्य है।

$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh

हालाँकि, फ़ाइल परिणामों को निष्पादित करने का प्रयास:

$ ./t.sh
bash: ./t.sh: Permission denied

getfaclआदेश कारण है कि पता चलता है:

$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx

इस मामले में, मेरा प्राथमिक समूह वह है domain usersजिसने ACL को प्रतिबंधित करके अनुमत अनुमतियों को निष्पादित किया है sudo setfacl -m 'g:domain\040users:rw-' t.sh। यह प्रतिबंध निम्नलिखित में से किसी भी आदेश द्वारा उठाया जा सकता है:

sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh

देख:

फाइलसिस्टम नॉइसेक विकल्प के साथ मुहिम शुरू की

अंत में, इस विशेष मामले में स्क्रिप्ट को चलाने में सक्षम नहीं होने का कारण यह है कि स्क्रिप्ट जिस फाइल सिस्टम पर रहती है वह noexecविकल्प के साथ मुहिम की गई थी । यह विकल्प उस फ़ाइल सिस्टम पर किसी भी फ़ाइल को निष्पादित होने से रोकने के लिए POSIX अनुमतियों को ओवरराइड करता है।

mountसभी माउंट किए गए फाइल सिस्टम को सूचीबद्ध करने के लिए इसे चेक किया जा सकता है ; माउंट विकल्प को फाइलसिस्टम के अनुरूप प्रविष्टि में कोष्ठक में सूचीबद्ध किया गया है, उदाहरण के लिए

/dev/sda3 on /tmp type ext3 (rw,noexec)

आप स्क्रिप्ट को किसी अन्य माउंटेड फाइल सिस्टम पर ले जा सकते हैं या फाइल सिस्टम को रिमूव करने की अनुमति दे सकते हैं:

sudo mount -o remount,exec /dev/sda3 /tmp

नोट: मैंने /tmpयहां एक उदाहरण के रूप में उपयोग किया है क्योंकि विकल्पों के सेट के साथ घुड़सवार रखने के लिए अच्छे सुरक्षा कारण हैं।/tmpnoexec,nodev,nosuid


2
मैंने chmod 777 सेट किया और अभी भी यह त्रुटि है।
पिओटर स्टैप

2
विभाजन पर मेरा कोई अमल नहीं था।
पिओटर स्टैप

तो मैं लानत है पर कोई अमल नहीं है और यह fstab में सूचीबद्ध नहीं है। क्यों नरक यह मेरे गैर tmp विभाजन मेरे पास कर रहा है?
डेरिक

1
यह था कि /ex / fstab में noexec विकल्प।
user208145

मैं जोड़ना चाहूंगा कि यह जांचना भी बुद्धिमान है कि स्क्रिप्ट वाला फ़ोल्डर "निष्पादन योग्य" है या नहीं (इसलिए इसमें एक्स ध्वज है या नहीं)। यदि ऐसा नहीं होता है, तो स्क्रिप्ट रूट उपयोगकर्ता द्वारा केवल निष्पादन योग्य होगी।
लेटरोकेन

30

प्रयत्न

chmod 755 script.sh

यह फ़ाइल को निष्पादन योग्य बना देगा। फिर कोशिश करो,

./script.sh

उम्मीद है कि यह काम करेगा।


2
U & L के लिए Iwelcomme, मैं कन्वेंशन के अनुसार सुधार, हालांकि यह शायद ही पिछले जवाब के लिए कुछ भी जोड़ें।
Archemar

8
कभी-कभी, सबसे छोटा उत्तर सबसे अच्छा होता है :)
समीरा कुमारसिंह

1

Cmd चलाने वाले एडमिन के साथ मेरी win7 पर; मेरे पास .sh साइबरगिन64 / बिन / बैश से जुड़ी फाइलें हैं, लेकिन इसे cmd द्वारा अवरुद्ध किया गया था। उपरोक्त सुझावों में से किसी ने भी मदद नहीं की (chmod, setfacl, Mount)।

नीचे दिए गए समाधान ने काम किया, यह एक व्यवस्थापक स्लेज-हैमर एसएल-फिक्सर है जब भी फ़ोल्डर्स / फ़ाइल win7 पर व्यवस्थापक के लिए दुर्गम हो जाते हैं, जो अक्सर होता है):

  Start > run cmd as Admin
  c:\> script.sh
    Access is denied.

  cmd> chmod 0777 script.sh c:\cygwin64\bin\bash.exe
  cmd> script.sh
    Access is denied.

  > assoc .sh
  .sh=bash

  > ftype bash
  bash=C:\cygwin64\bin\bash.exe -- "%1" %*

  > bash
  $ FILE=c:/cygwin64/bin/bash.exe
  $ FILE=${FILE////\\} # s,/,\,g

  # Compare these permissions using accesschk by Mark Russinovich 2015
  $ accesschk.exe -lq  $FILE 
  $ accesschk.exe -lq c:/windows/system32/cmd.exe
  # [large output not shown]

  # === Solution: Change windows acl for bash ===
  $ takeown /F $FILE /A > /dev/null
  $ icacls $FILE /t /q /c /reset
  $ icacls $FILE /t /q /c /grant    :r Everyone:F
  $ icacls $FILE /t /q /c /setowner Administrators  
  # ====

  cmd> script.sh
    OK .. invokes bash
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.