जब मैं दौड़ने की कोशिश करता ./script.sh
हूं तो मुझे मिल जाता है Permission denied
लेकिन जब मैं दौड़ता हूं तो bash script.sh
सब ठीक होता है।
मैंने गलत क्या किया?
जब मैं दौड़ने की कोशिश करता ./script.sh
हूं तो मुझे मिल जाता है Permission denied
लेकिन जब मैं दौड़ता हूं तो bash script.sh
सब ठीक होता है।
मैंने गलत क्या किया?
जवाबों:
इसका मतलब है कि आपके पास निष्पादित अनुमति बिट के लिए सेट नहीं है 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
यहां एक उदाहरण के रूप में उपयोग किया है क्योंकि विकल्पों के सेट के साथ घुड़सवार रखने के लिए अच्छे सुरक्षा कारण हैं।/tmp
noexec,nodev,nosuid
प्रयत्न
chmod 755 script.sh
यह फ़ाइल को निष्पादन योग्य बना देगा। फिर कोशिश करो,
./script.sh
उम्मीद है कि यह काम करेगा।
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
getfacl script.sh
?