إذا أظهر مبنى الأوامر (Terminal) في macOS رسالة "تم رفض الإذن" (permission denied) عند تشغيل برنامج نصي محلي لـ Shell، فتحقق أولاً من أنك في المجلد الصحيح وبإمكانك قراءة الملف. ثم أضف إذن التنفيذ لحساب المستخدم الخاص بك باستخدام chmod u+x، إذا كنت تنوي تشغيله مباشرةً. وإذا لم يحل ذلك الخطأ، فتحقق من المجلدات الحاوية له وما إذا كان macOS يحظر التطبيق الذي فتح واجهة shell من الوصول إلى الملف. تجنب استخدام sudo أو إجراء تغييرات واسعة على الأذونات كحل أول.

1. تأكيد مسار البرنامج النصي والمجلد الحالي

افتح مبنى الأوامر (Terminal) وانتقل إلى المجلد الذي يحتوي على البرنامج النصي. ضع المسار بين علامتي اقتباس إذا كان يحتوي على مسافات:

cd "/Users/yourname/Projects/My Scripts"
ls -l "./build.sh"

استبدل مسار المثال واسم الملف بالمسار والاسم الخاصين بك. يُظهر مخرج الأمر ls -l أذونات الملف ومالكه. إذا ذكر أن الملف غير موجود، فحدد المجلد الصحيح أو استخدم المسار الكامل. المسار النسبي مثل ./build.sh يعني "build.sh في المجلد الحالي"؛ وهو لا يبحث في المجلدات الأخرى.

2. إضافة إذن التنفيذ إلى البرنامج النصي

إذا كان الملف موجوداً وأنت مالكه، فأضف إذن التنفيذ لحسابك فقط، ثم شغّله من مجلده:

chmod u+x "./build.sh"
./build.sh

يستخدم دليل البرمجة النصية لـ shell من Apple الأمر chmod u+x قبل تشغيل البرنامج النصي. يُقصر الحرف u التغيير على مالك الملف؛ بينما يضيف +x إذن التنفيذ. هذا الخيار أكثر تقييداً وأماناً من chmod 777، الذي يمنح أذونات القراءة والكتابة والتنفيذ للجميع. أساسيات البرمجة النصية لـ Shell من Apple

إذا استمر Terminal في إظهار رسالة "permission denied"، فتحقق من الأذونات مرة أخرى باستخدام ls -l. يمكنك أيضاً التحقق من مالك الملف عبر ls -l ومعرفة اسم حسابك باستخدام whoami. إذا كان حساب آخر يمتلك البرنامج النصي وكنت تفتقر إلى إذن تعديله، فاستخدم نسخة منه في مجلد تملكه، أو اطلب من المالك أو المسؤول منحك حق الوصول المناسب. لا تقم بالاستيلاء على ملكية ملفات النظام كحل سريع مختصر.

3. التحقق من الوصول إلى المجلد ومحتويات البرنامج النصي

يتطلب التنفيذ إمكانية الوصول عبر المسار بالكامل بالإضافة إلى الإذن على ملف البرنامج النصي نفسه. تحقق من المجلدات الأصلية الحاوية للبرنامج النصي إذا لم تتمكن من الدخول إلى دليله أو الوصول إلى الملف. إذا كان الملف موجوداً على وحدة تخزين مشتركة أو خارجية أو خاضعة للإدارة، فقد تختلف قواعد الوصول إليها؛ جرب استخدام نسخة في مجلد تملكه، بشرط أن يكون نسخها أمراً ملائماً ومسموحاً به.

إذا أظهر أمرك بدلاً من ذلك رسالة Permission denied أثناء محاولة البرنامج النصي إنشاء ملف مخرجات أو تعديله، فقد يكون البرنامج النصي قابلاً للتنفيذ ولكنه يفتقر إلى إذن الكتابة في تلك الوجهة. تحقق من مجلد الوجهة والمسار المكتوب داخل البرنامج النصي. لا تجعل البرنامج النصي قابلاً للكتابة أو التنفيذ من قبل الجميع لمجرد تجاوز الخطأ.

بالنسبة للبرامج النصية الموجودة داخل Desktop أو Documents أو Downloads، قد تؤثر أيضاً ضوابط الخصوصية في macOS عندما يقوم تطبيق آخر غير Terminal بتشغيلها. في "إعدادات النظام" (System Settings)، افتح الخصوصية والأمن > الملفات والمجلدات (Privacy & Security > Files & Folders) وراجع أذونات الوصول المدرجة للتطبيق المعني. تصف Apple عناصر التحكم هذه بأنها وصول مخصص لكل تطبيق إلى مواقع محددة. لا يُعد خطأ الأذونات الناتج عن أمر shell دليلاً بحد ذاته على أن إعداد الخصوصية هذا هو السبب. Apple: التحكم في الوصول إلى الملفات والمجلدات على الـ Mac

4. إذا فشل التنفيذ المباشر، شغّل المفسر بشكل صريح

قد يكون البرنامج النصي قابلاً للقراءة بواسطة حسابك ولكنه يفتقر إلى إذن التنفيذ. إذا كان برنامج shell نصياً، فيمكنك مطالبة المفسر الخاص به بقراءته وتشغيله مباشرةً:

/bin/sh "./build.sh"

استخدم هذا الإجراء فقط عندما يكون البرنامج النصي مخصصاً لـ sh. إذا كان السطر الأول منه يحدد مفسراً آخر، مثل Bash، فاستخدم ذلك المفسر بدلاً منه؛ حيث يحدد سطر المفسر (سطر #!) الطريقة المخصصة لتشغيل البرنامج النصي. توصي Apple بتضمين هذا السطر لضمان التوافق والاتساق. أساسيات البرمجة النصية لـ Shell من Apple

يمكن للتشغيل عبر مفسر تجاوز الحاجة إلى إذن التنفيذ على ملف البرنامج النصي، ولكنه لا يمنح الإذن بقراءة البرنامج النصي أو الوصول إلى الملفات التي يستخدمها. إذا تغيرت الرسالة لتشير إلى مفسر مفقود أو خطأ في بناء الجملة (syntax error)، فعليك معالجة تلك المشكلة بعينها؛ فهي مشكلة مختلفة عن إذن التنفيذ.

5. لا تستخدم sudo ولا تعطل تدابير الحماية الأمنية كحل مختصر

يقوم sudo بتشغيل أمر بامتيازات مرتفعة؛ وهو لا يعالج مشكلة ملف مفقود، أو مسار خاطئ، أو برنامج نصي لم تفحصه. استخدمه فقط عندما تفهم سبب تطلب المهمة وصول المسؤول وتثق في مصدر البرنامج النصي ومحتوياته. يمكن للتغييرات الشاملة مثل chmod 777 أن تعرض الملفات للتعديل من قِبل مستخدمين آخرين.

تختلف أيضاً رسالة "تم رفض الإذن" (permission denied) في البرامج النصية لـ shell عن تحذير Gatekeeper بشأن تطبيق لا يمكن لـ macOS التحقق منه. تنطبق خطوات "الفتح على أي حال" (Open Anyway) الموثقة من Apple على تنبيهات التطبيقات وتتطلب التأكد من أن التطبيق جدير بالثقة؛ وليست حلاً عاماً لأذونات ملفات shell. Apple: فتح التطبيقات بأمان على جهاز Mac الخاص بك

تشخيص سريع

  • ظهور ./script.sh: permission denied مباشرةً: تحقق من إذن التنفيذ للملف؛ إذا كنت تملكه وتثق به، فجرب chmod u+x "./script.sh".
  • تعذر العثور على الملف: تحقق من مجلدك الحالي والاسم الدقيق للملف.
  • يبدأ البرنامج النصي بالعمل، ثم يُرفض أحد الأوامر: تحقق من الملف أو المجلد المعين الذي يحاول ذلك الأمر الوصول إليه.
  • تنبيه من تطبيق يفيد بأنه لا يمكن التحقق من المطور: اتبع إرشادات أمان التطبيقات من Apple فقط بعد التحقق من مصدر التطبيق؛ فهذا التنبيه منفصل تماماً عن إذن التنفيذ الخاص بـ shell.

تساعد عمليات التحقق هذه في حصر المشكلة إما في مسار البرنامج النصي، أو بت التنفيذ الخاص به، أو الوصول إلى ملف يستخدمه، أو ضوابط الخصوصية والأمان الخاصة بالتطبيق. قم بتغيير الإذن أو الإعداد الذي تدعمه الدلائل فقط، وأعد تشغيل الأمر نفسه لمعرفة ما إذا كان الخطأ قد تغير.

المصادر