यदि कोई लोकल शेल स्क्रिप्ट चलाते समय macOS Terminal "permission denied" रिपोर्ट करता है, तो पहले यह जाँचें कि आप सही फ़ोल्डर में हैं और फ़ाइल पढ़ सकते हैं। फिर यदि आप इसे सीधे चलाना चाहते हैं, तो chmod u+x के साथ अपने उपयोगकर्ता के लिए निष्पादन अनुमति (execute permission) जोड़ें। यदि इससे त्रुटि का समाधान नहीं होता है, तो शामिल फ़ोल्डरों की जाँच करें और देखें कि क्या macOS उस ऐप को फ़ाइल तक पहुँचने से रोक रहा है जिसने शेल लॉन्च किया था। पहले समाधान के रूप में sudo का उपयोग करने या व्यापक अनुमति परिवर्तनों से बचें।
1. स्क्रिप्ट पथ (path) और अपने वर्तमान फ़ोल्डर की पुष्टि करें
Terminal खोलें और स्क्रिप्ट वाले फ़ोल्डर में जाएँ। यदि पथ में स्पेस हैं, तो उसे उद्धरण चिह्नों (quotes) में रखें:
cd "/Users/yourname/Projects/My Scripts"
ls -l "./build.sh"
उदाहरण पथ और फ़ाइल नाम को अपने विवरण से बदलें। ls -l आउटपुट फ़ाइल की अनुमतियाँ और स्वामी (owner) दिखाता है। यदि यह कहता है कि फ़ाइल नहीं मिल रही है, तो सही फ़ोल्डर ढूँढें या पूर्ण पथ का उपयोग करें। ./build.sh जैसे सापेक्ष पथ (relative path) का अर्थ है "वर्तमान फ़ोल्डर में build.sh"; यह अन्य फ़ोल्डरों में नहीं खोजता है।
2. अपनी स्क्रिप्ट में निष्पादन अनुमति (execute permission) जोड़ें
यदि फ़ाइल मौजूद है और आप इसके स्वामी हैं, तो केवल अपने खाते के लिए निष्पादन अनुमति जोड़ें, फिर इसे इसके फ़ोल्डर से चलाएँ:
chmod u+x "./build.sh"
./build.sh
Apple की शेल स्क्रिप्टिंग गाइड स्क्रिप्ट चलाने से पहले chmod u+x का उपयोग करती है। u इस परिवर्तन को केवल फ़ाइल स्वामी तक सीमित रखता है; +x निष्पादित करने की अनुमति जोड़ता है। यह chmod 777 से अधिक संकीर्ण (सुरक्षित) है, जो सभी को पढ़ने, लिखने और निष्पादित करने की अनुमति देता है। Apple’s Shell Script Basics
यदि Terminal अभी भी "permission denied" कहता है, तो ls -l के साथ फिर से अनुमतियों का निरीक्षण करें। आप ls -l से यह भी जाँच सकते हैं कि फ़ाइल का स्वामी कौन है और whoami से अपने खाते का नाम देख सकते हैं। यदि कोई अन्य खाता स्क्रिप्ट का स्वामी है और आपके पास इसे बदलने की अनुमति नहीं है, तो अपने स्वामित्व वाले फ़ोल्डर में इसकी एक प्रति का उपयोग करें या स्वामी या व्यवस्थापक (administrator) से उचित एक्सेस देने के लिए कहें। शॉर्टकट के रूप में सिस्टम फ़ाइलों का स्वामित्व न लें।
3. फ़ोल्डर एक्सेस और स्क्रिप्ट की सामग्री की जाँच करें
निष्पादन के लिए पथ (path) के माध्यम से एक्सेस के साथ-साथ स्क्रिप्ट पर स्वयं अनुमति की भी आवश्यकता होती है। यदि आप स्क्रिप्ट की डायरेक्टरी में प्रवेश नहीं कर सकते हैं या फ़ाइल तक नहीं पहुँच सकते हैं, तो उसके पैरेंट फ़ोल्डरों की जाँच करें। यदि यह किसी साझा (shared), बाहरी (external), या प्रबंधित वॉल्यूम पर मौजूद है, तो इसके एक्सेस नियम भिन्न हो सकते हैं; अपने स्वामित्व वाले फ़ोल्डर में एक प्रति आज़माएँ, बशर्ते इसे कॉपी करना उचित हो।
यदि इसके बजाय आपका कमांड तब Permission denied लौटाता है जब स्क्रिप्ट किसी आउटपुट फ़ाइल को बनाने या संशोधित करने का प्रयास कर रही होती है, तो हो सकता है कि स्क्रिप्ट निष्पादन योग्य (executable) हो लेकिन उस गंतव्य पर लिखने की अनुमति (write access) न हो। गंतव्य फ़ोल्डर और स्क्रिप्ट में दिए गए पथ की जाँच करें। केवल किसी त्रुटि से पार पाने के लिए स्क्रिप्ट को सभी के लिए लिखने योग्य या निष्पादन योग्य न बनाएँ।
Desktop, Documents या Downloads के अंदर मौजूद किसी स्क्रिप्ट के लिए, जब Terminal के अलावा कोई अन्य ऐप इसे लॉन्च कर रहा हो तो macOS प्राइवेसी नियंत्रण भी मायने रख सकते हैं। System Settings में, Privacy & Security > Files & Folders खोलें और संबंधित ऐप के लिए सूचीबद्ध एक्सेस की समीक्षा करें। Apple इन नियंत्रणों को विशिष्ट स्थानों के लिए प्रति-ऐप एक्सेस के रूप में वर्णित करता है। किसी शेल कमांड से मिलने वाली अनुमतियों की त्रुटि अपने आप में इस बात का प्रमाण नहीं है कि यह प्राइवेसी सेटिंग ही इसका कारण है। Apple: Mac पर फ़ाइलों और फ़ोल्डरों तक पहुँच नियंत्रित करें
4. यदि सीधा निष्पादन विफल रहता है, तो इंटरप्रेटर को स्पष्ट रूप से चलाएँ
कोई स्क्रिप्ट आपके खाते द्वारा पढ़ने योग्य हो सकती है लेकिन उसमें निष्पादन अनुमति का अभाव हो सकता है। यदि यह एक शेल स्क्रिप्ट है, तो आप इसके इंटरप्रेटर से इसे सीधे पढ़ने और चलाने के लिए कह सकते हैं:
/bin/sh "./build.sh"
इसका उपयोग केवल तभी करें जब स्क्रिप्ट sh के लिए हो। यदि इसकी पहली पंक्ति किसी अन्य इंटरप्रेटर का नाम देती है, जैसे कि Bash, तो उसके बजाय उस इंटरप्रेटर का उपयोग करें; इंटरप्रेटर लाइन (#! लाइन) यह निर्दिष्ट करती है कि स्क्रिप्ट को किस तरह चलाने का इरादा है। Apple निरंतरता के लिए उस पंक्ति को शामिल करने की अनुशंसा करता है। Apple’s Shell Script Basics
इंटरप्रेटर के माध्यम से चलाने से स्क्रिप्ट फ़ाइल पर निष्पादन अनुमति की आवश्यकता को बायपास किया जा सकता है, लेकिन यह स्क्रिप्ट को पढ़ने या इसके द्वारा उपयोग की जाने वाली फ़ाइलों तक पहुँचने की अनुमति नहीं देता है। यदि संदेश किसी अनुपलब्ध इंटरप्रेटर या सिंटैक्स त्रुटि में बदल जाता है, तो उस विशिष्ट समस्या का समाधान करें; यह निष्पादन अनुमति से अलग समस्या है।
5. शॉर्टकट के रूप में sudo का उपयोग न करें या सुरक्षा सुरक्षोपायों को अक्षम न करें
sudo किसी कमांड को उन्नत विशेषाधिकारों (elevated privileges) के साथ चलाता है; यह किसी गुम फ़ाइल, गलत पथ, या ऐसी स्क्रिप्ट को ठीक नहीं करता है जिसे आपने जाँचा नहीं है। इसका उपयोग केवल तभी करें जब आप समझते हों कि कार्य के लिए व्यवस्थापक एक्सेस की आवश्यकता क्यों है और स्क्रिप्ट के स्रोत और सामग्री पर भरोसा करते हों। chmod 777 जैसे व्यापक परिवर्तन फ़ाइलों को अन्य उपयोगकर्ताओं द्वारा संशोधित किए जाने के जोखिम में डाल सकते हैं।
शेल स्क्रिप्ट का "permission denied" संदेश Gatekeeper की उस चेतावनी से भी अलग है जो ऐसे ऐप के बारे में होती है जिसे macOS सत्यापित नहीं कर सकता। Apple के दस्तावेज़ीकृत "Open Anyway" चरण ऐप अलर्ट पर लागू होते हैं और इसके लिए यह विश्वास आवश्यक है कि ऐप भरोसेमंद है; वे शेल फ़ाइल अनुमतियों के लिए कोई सामान्य समाधान नहीं हैं। Apple: अपने Mac पर ऐप्स सुरक्षित रूप से खोलें
त्वरित निदान
- तुरंत
./script.sh: permission deniedआना: फ़ाइल की निष्पादन अनुमति जाँचें; यदि आप इसके स्वामी हैं और इस पर भरोसा करते हैं, तोchmod u+x "./script.sh"आज़माएँ। - फ़ाइल नहीं मिल रही है: अपने वर्तमान फ़ोल्डर और सटीक फ़ाइल नाम की पुष्टि करें।
- स्क्रिप्ट शुरू होती है, फिर किसी कमांड को अस्वीकार (denied) कर दिया जाता है: उस विशिष्ट फ़ाइल या फ़ोल्डर की जाँच करें जिसे वह कमांड एक्सेस करने का प्रयास कर रहा है।
- एक ऐप अलर्ट कहता है कि डेवलपर को सत्यापित नहीं किया जा सकता: ऐप के स्रोत को सत्यापित करने के बाद ही Apple के ऐप-सुरक्षा मार्गदर्शन का पालन करें; वह अलर्ट शेल की निष्पादन अनुमति से अलग है।
ये जाँच समस्या को स्क्रिप्ट पथ, इसके निष्पादन बिट, इसके द्वारा उपयोग की जाने वाली फ़ाइल तक पहुँच, या ऐप-विशिष्ट प्राइवेसी या सुरक्षा नियंत्रण तक सीमित कर देती हैं। केवल उसी अनुमति या सेटिंग को बदलें जो साक्ष्य से मेल खाती हो, और यह देखने के लिए कि क्या त्रुटि बदल गई है, वही कमांड फिर से चलाएँ।
स्रोत
- Shell Script Basics — Apple Developer
- Control access to files and folders on Mac — Apple Support
- Open apps safely on your Mac — Apple Support