أشهر رسالة يقابلها كل مستخدم لينكس جديد (كل الرسائل هنا من تجربة فعلية على Ubuntu 24.04 بمستخدم عادي):
bash: ./deploy.sh: Permission denied
أو عند محاولة الكتابة:
touch: cannot touch 'app.log': Permission denied
لينكس ليس عنيدًا معك — هو يطبّق نظام صلاحيات صارمًا هو سرّ أمانه. من يفهم هذا النظام مرة واحدة لا يحتاج «حلولًا سحرية» بعدها.
أولًا: اقرأ الوضع قبل أي أمر
ls -l deploy.sh
-rw-r--r-- 1 baraa developers 512 Jul 10 09:00 deploy.sh
فكّ الشيفرة -rw-r--r--:
| الجزء | يخص | معناه هنا |
|---|---|---|
rw- | المالك (baraa) | قراءة + كتابة، بلا تنفيذ |
r-- | المجموعة (developers) | قراءة فقط |
r-- | بقية المستخدمين | قراءة فقط |
المشكلة ظاهرة فورًا: لا أحد يملك x — لذلك رفض النظام تنفيذ السكربت.
الحالات الأربع الأشهر وحلولها
1) سكربت لا يعمل → أعطه إذن التنفيذ
chmod +x deploy.sh # أضف صلاحية التنفيذ
./deploy.sh # ✅ يعمل الآن
هذا حل أغلب حالات Permission denied عند المبتدئين. وبديل سريع دون تغيير الصلاحيات: bash deploy.sh، فهنا المنفَّذ هو bash نفسه، وهو يحتاج فقط أن يقرأ الملف، فتكفيه r.
2) ملف يملكه مستخدم آخر → صحّح الملكية
يحدث كثيرًا بعد فك أرشيف بـ sudo أو نسخ ملفات من مكان محمي — مجلد مشروعك صار ملكًا لـ root:
ls -l # المالك root? هذه هي المشكلة
sudo chown -R $USER:$USER . # أعد ملكية مجلد المشروع الحالي إليك
القاعدة: ملفات مشروعك يجب أن تكون ملكك أنت — وبعدها لن تحتاج sudo للتعامل معها إطلاقًا.
3) مهمة نظام حقيقية → sudo في محله
sudo apt install nginx # ✅ تثبيت حزم
sudo nano /etc/hosts # ✅ ملفات النظام
sudo systemctl restart nginx # ✅ إدارة خدمات
💡 نسيت sudo؟
sudo !!تعيد تنفيذ الأمر السابق نفسه بصلاحيات مرفوعة.
⚠️ لكن انتبه: sudo pip install وsudo npm install ليسا من هذه
الفئة — راجع حل أخطاء pip لتعرف لماذا
البيئة الافتراضية هي الحل الصحيح.
4) المنافذ الصغيرة (أقل من 1024)
Error: listen EACCES: permission denied 0.0.0.0:80
المنافذ تحت 1024 لا يفتحها إلا root افتراضيًا (القيمة الفعلية في /proc/sys/net/ipv4/ip_unprivileged_port_start، وهي 1024 على Ubuntu). للتطوير المحلي استخدم منفذًا عاليًا (3000، 8080). وفي الإنتاج اجعل خادمًا مثل Nginx يستمع على 80 و443 ويمرّر الطلبات لتطبيقك، بدل تشغيل التطبيق كله بـ root. وإن كانت الرسالة EADDRINUSE لا EACCES، فالمنفذ مستخدم أصلًا: حل خطأ EADDRINUSE.
5) الصلاحية على المجلد، لا على الملف
هذه الحالة تحيّر حتى من يعرف chmod. أعطينا ملفًا الصلاحية 777 كاملة، داخل مجلد صلاحيته 555 (r-x للجميع، بلا كتابة):
rm locked/f.txt
# rm: cannot remove 'locked/f.txt': Permission denied
حذف ملف أو إنشاؤه أو إعادة تسميته تعديل على المجلد (قائمة أسمائه)، لا على الملف. فالمطلوب w على المجلد، وصلاحيات الملف نفسه لا علاقة لها. وبالمنطق نفسه:
| على المجلد | تسمح بـ |
|---|---|
r | عرض أسماء ما بداخله (ls) |
w (مع x) | إنشاء ملفات فيه وحذفها وإعادة تسميتها |
x | الدخول إليه (cd) والوصول إلى ما بداخله بالاسم |
لهذا مجلد بصلاحية 644 (بلا x) يعطي:
bash: cd: locked: Permission denied
الإصلاح المعتاد للمجلدات 755، لا 644.
6) sudo مع > لا يعمل
sudo echo "127.0.0.1 tcf.local" > /etc/hosts
# bash: /etc/hosts: Permission denied
sudo موجود ومع ذلك رُفضت العملية. السبب أن > ليست جزءًا من الأمر الذي يشغّله sudo: الطرفية (bash) تفتح الملف للكتابة أولًا بصلاحياتك أنت، ثم تشغّل sudo echo. لاحظ أن الرسالة تبدأ بـ bash: لا بـ sudo:. الحل أن يكون من يكتب في الملف هو الأمر الذي يعمل بـ sudo:
echo "127.0.0.1 tcf.local" | sudo tee -a /etc/hosts # -a للإضافة بدل الاستبدال
بدون -a يستبدل tee محتوى الملف كله، وهو ما لا تريده مع /etc/hosts.
chmod بالأرقام — للفهم لا للحفظ
كل صلاحية رقم: r=4، w=2، x=1، والمجموع لكل فئة:
chmod 755 deploy.sh # rwx r-x r-x — سكربتات: المالك كامل والبقية تنفيذ
chmod 644 notes.txt # rw- r-- r-- — ملفات عادية: المالك يكتب والبقية تقرأ
هذان الرقمان (755 للتنفيذ، 644 للملفات) يغطيان الحياة اليومية كلها.
وchmod 777 ليس بينهما أبدًا — إنه "افتحوا كل الأبواب للجميع".
قائمة تحقّق سريعة
ls -lأولًا — من المالك؟ وأي صلاحية ناقصة؟- سكربت لا يعمل؟ →
chmod +x. - ملفات مشروعك ملك root؟ →
sudo chown -R $USER:$USER .مرة واحدة. - الأمر يمس النظام نفسه؟ → sudo بثقة. يمس ملفاتك؟ → المشكلة ملكية.
- لا تستطيع حذف ملف أو إنشاءه؟ → الصلاحية الناقصة على المجلد (
wوx). sudo ... > ملفمرفوض؟ →| sudo tee ملف.- لا تحل أي شيء بـ 777.
الخلاصة
Permission denied رسالة إخبارية لا عدائية: "الصلاحية الفلانية ناقصة".
اقرأ ls -l، حدد الصلاحية الناقصة والفئة المعنية، وأعطِ أضيق إذن يحل
المشكلة: +x للسكربتات، chown لملكيتك، وsudo لملفات النظام حصرًا.
أكمل أساسيات الطرفية في مسار لينكس بالعربي، وكمّل سلسلة أخطاء البيئة مع حل أخطاء pip install وحل خطأ المنفذ المستخدم EADDRINUSE.