دليل

صلاحيات الملفات في لينكس: chmod وchown وsudo بأمثلة

آخر تحديث: · Skillaria.Top

تُحدَّد صلاحيات الملفات في لينكس بثلاث مجموعات rwx: للمالك، وللمجموعة، وللآخرين. تُغيَّر بالأمر chmod بصيغة رمزية (chmod u+x) أو رقمية (chmod 755، حيث r=4 وw=2 وx=1). ويغيّر الأمر chown المالك، وتُنفَّذ أعمال المدير عبر sudo. وعادةً يعني خطأ Permission denied أن مستخدمك لا يملك الصلاحية المطلوبة على الملف أو على أحد المجلدات في المسار.

تجيب صلاحيات الملفات في لينكس عن السؤال: «من يستطيع أن يفعل ماذا بهذا الملف؟». لكل ملف مالك ومجموعة، وثلاث مجموعات من الصلاحيات: للمالك، وللمجموعة، ولجميع الآخرين. تُغيَّر الصلاحيات بالأمر chmod، ويُغيَّر المالك بالأمر chown، وتُنفَّذ الأعمال التي تحتاج إلى صلاحيات المدير عبر sudo. في هذا الدليل نشرح كيفية قراءة الصلاحيات وتغييرها، وكيفية حل خطأ Permission denied.

كيف تعرف صلاحيات الملف

تظهر الصلاحيات في مخرجات ls -l:

$ ls -l
-rw-r--r-- 1 alice developers  1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers   356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers  4096 Oct 10 13:50 secrets

تُقرأ الأحرف العشرة الأولى كما يلي:

  • الحرف الأول هو النوع: - ملف عادي، وd مجلد، وl رابط رمزي.
  • الأحرف من 2 إلى 4 هي صلاحيات المالك (user).
  • الأحرف من 5 إلى 7 هي صلاحيات المجموعة (group).
  • الأحرف من 8 إلى 10 هي صلاحيات الآخرين (others).

بعد ذلك يأتي عدد الروابط الصلبة، ثم المالك (alice)، ثم المجموعة (developers)، ثم الحجم والتاريخ والاسم. ولعرض ملف واحد يمكن استخدام stat:

$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh

معنى r وw وx

تختلف معاني الصلاحيات بين الملفات والمجلدات، وهذا هو السبب الأكبر للالتباس.

الصلاحيةللملفللمجلد
r (read)قراءة المحتوىرؤية قائمة الملفات (ls)
w (write)تعديل المحتوىإنشاء الملفات وحذفها وإعادة تسميتها داخل المجلد
x (execute)تشغيله كبرنامجالدخول إلى المجلد (cd) والوصول إلى الملفات عبر المسار

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

يتحقق النظام من الصلاحيات بهذا الترتيب: إذا كنت المالك طُبِّقت صلاحيات المالك، وإلا إذا كنت في مجموعة الملف طُبِّقت صلاحيات المجموعة، وإلا طُبِّقت صلاحيات الآخرين. ويتجاوز المستخدم root فحوص القراءة والكتابة.

الصيغة الرقمية: 755، 644، 600

لكل صلاحية وزن: r = 4، w = 2، x = 1. مجموع الأوزان لكل مجموعة من المجموعات الثلاث يعطي رقماً من 0 إلى 7.

الرقمالصلاحياتالحساب
7rwx4+2+1
6rw-4+2
5r-x4+1
4r--4
0---0

من المفيد حفظ هذه القيم الشائعة:

الوضعالشكلمكان الاستخدام
644rw-r--r--الملفات العادية، وملفات الإعداد، وHTML
755rwxr-xr-xالمجلدات والسكريبتات والبرامج
600rw-------مفاتيح SSH الخاصة، والملفات التي تحوي كلمات مرور
700rwx------المجلد ~/.ssh، والمجلدات الشخصية
640rw-r-----ملفات الإعداد التي تقرؤها مجموعة الخدمة
777rwxrwxrwxالجميع يفعل كل شيء، ونادراً ما تكون هذه الصلاحية مطلوبة

الأمر chmod: تغيير الصلاحيات

الوضع الرقمي

يحدد الشكل الرقمي الصلاحيات كلها دفعة واحدة:

chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519

الوضع الرمزي

يغيّر الشكل الرمزي صلاحيات محددة دون المساس بالباقي. الفئات: u المالك، وg المجموعة، وo الآخرون، وa الجميع. العمليات: + للإضافة، و- للإزالة، و= للتعيين الدقيق.

chmod +x deploy.sh        # السماح بالتشغيل
chmod u+x,g-w file        # التشغيل للمالك، وإزالة الكتابة عن المجموعة
chmod o-rwx secrets/      # لا شيء للآخرين
chmod g=rx app/           # القراءة والدخول فقط للمجموعة

التكرار: الملفات والمجلدات تُعالَج بشكل مختلف

يطبّق الخيار -R الصلاحيات على شجرة المجلدات كلها. لكن chmod -R 755 يجعل كل الملفات قابلة للتنفيذ، وهذا عادةً غير مطلوب. الأفضل أن تفصل بين الملفات والمجلدات باستخدام find:

find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +

وهناك صيغة مختصرة: الحرف الكبير X يضيف صلاحية التنفيذ إلى المجلدات والملفات التي لها تنفيذ أصلاً فقط.

chmod -R u=rwX,go=rX /srv/site

الأمر chown: تغيير المالك والمجموعة

لا يستطيع تغيير مالك الملف إلا root، لذلك يُشغَّل chown عادةً عبر sudo.

sudo chown alice report.txt               # المالك
sudo chown alice:developers report.txt    # المالك والمجموعة
sudo chown :www-data index.html           # المجموعة فقط
sudo chown -R www-data:www-data /var/www/site

لتغيير المجموعة وحدها يوجد الأمر chgrp: sudo chgrp developers report.txt. ومجموعاتك تعرضها id أو groups.

$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)

لإضافة مستخدم إلى مجموعة نستخدم sudo usermod -aG developers bob. الخيار -a ضروري: من دونه يُزال المستخدم من جميع المجموعات الإضافية الأخرى. وتسري المجموعة الجديدة بعد تسجيل الدخول من جديد.

sudo: تنفيذ الأوامر بصلاحيات المدير

يُنفِّذ sudo أمراً واحداً بصلاحيات root (أو مستخدم آخر)، ويطلب كلمة مرورك أنت، لا كلمة مرور root. تُسجَّل كل الاستدعاءات في السجل، فيُعرف من فعل ماذا.

sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql       # باسم المستخدم postgres
sudo -i                     # واجهة root تفاعلية
sudo -l                     # ما المسموح لي بتنفيذه

تُحدَّد الصلاحيات في الملف /etc/sudoers وفي الملفات الموجودة في المجلد /etc/sudoers.d/. وينبغي تحرير هذه الملفات عبر sudo visudo فقط، لأنه يفحص الصياغة، فلا يؤدي خطأ فيها إلى فقدان صلاحية sudo. في Ubuntu تُمنح صلاحية sudo بالانتماء إلى مجموعة sudo، وفي أنظمة RHEL تُمنح بالانتماء إلى مجموعة wheel.

# /etc/sudoers.d/deploy — يسمح للمستخدم deploy بإعادة تشغيل nginx فقط
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

لماذا لا يعمل sudo echo > file

هذا فخ شائع:

$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied

إعادة التوجيه >> تنفذها واجهتك لا sudo، لذلك يُفتح الملف دون صلاحيات root. الطريقة الصحيحة هي استخدام tee:

echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts

Permission denied: الأسباب وطرق الإصلاح

يعني خطأ Permission denied أن النواة رفضت العملية لعمليتك. وخطوات التشخيص واحدة دائماً: من أنا (id)، ومن المالك وما الصلاحيات (ls -l)، وما صلاحيات كل مجلد في المسار (namei -l).

$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root  root  /
drwxr-xr-x root  root  srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env

يظهر هنا أن المجلد app مغلق أمام الآخرين. فالمستخدم الذي ليس في مجموعة deploy لن يتجاوزه، مهما كانت صلاحيات الملف نفسه.

السكريبت لا يعمل

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

ليس للملف صلاحية التنفيذ. الحل هو chmod +x deploy.sh، أو التشغيل عبر المفسر: bash deploy.sh. وإذا كان القسم مركّباً بالخيار noexec (وهذا شائع في /tmp)، فلن يمكن تشغيل الملف مباشرة، وسيكون الحل الثاني هو الوحيد.

لا يمكن الكتابة في مجلد النظام

الملفات في /etc و/usr و/var/www تملكها root أو مستخدمو النظام. استخدم sudo للتعديلات المؤقتة، أما للعمل الدائم فامنح الصلاحية لمجموعة، لا للجميع.

خادم الويب يعيد 403

يعمل Nginx أو Apache بالمستخدم www-data (في Debian وUbuntu). يحتاج هذا المستخدم إلى قراءة الملفات، وإلى الصلاحية x على كل المجلدات في المسار. الإصلاح: sudo chown -R www-data:www-data /var/www/site، أو ضبط المجلدات على 755 والملفات على 644.

SSH لا يقبل المفتاح

يرفض SSH المفاتيح التي تكون صلاحياتها مفتوحة أكثر من اللازم. يجب أن يكون المفتاح الخاص 600، والمجلد ~/.ssh على 700، والملف authorized_keys على الخادم على 600.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys

لا وصول إلى Docker

تعني رسالة permission denied while trying to connect to the Docker daemon socket أنك لست في مجموعة docker. نفّذ sudo usermod -aG docker $USER ثم سجّل الخروج والدخول من جديد. وانتبه إلى أن عضوية هذه المجموعة تعادل عملياً صلاحيات root.

لماذا يُعد chmod 777 فكرة سيئة

نصيحة «فقط اعمل chmod 777» تزيل الخطأ، لكنها تسمح لأي مستخدم وأي عملية في النظام بالكتابة في الملف. إذا تم اختراق تطبيق ويب، يستطيع المهاجم تغيير هذه الملفات. الطريق الصحيح هو تحديد المستخدم الذي يحتاج الوصول، ثم منحه الصلاحية عبر المالك أو المجموعة.

umask: الصلاحيات الافتراضية

تُحسب صلاحيات الملفات الجديدة بمراعاة القناع umask. فالقيمة الشائعة 022 تنشئ الملفات بصلاحيات 644 والمجلدات بصلاحيات 755.

$ umask
0022

الخلاصة

صلاحيات لينكس هي ثلاث مجموعات rwx للمالك والمجموعة والآخرين. يغيّر chmod الصلاحيات بصيغة رقمية (755، 644، 600) أو رمزية، ويغيّر chown المالك، ويسمح sudo بتنفيذ أمر واحد بصلاحيات root. عند ظهور Permission denied تحقق من المستخدم وصلاحيات الملف وصلاحيات كل مجلد في المسار، ولا تعالج المشكلة بـ 777. يُشرح المستخدمون والمجموعات والصلاحيات وsudo بالتفصيل والتطبيق في دورة لينكس.

الأسئلة الشائعة

ماذا يعني chmod 755؟

يستطيع المالك القراءة والكتابة والتنفيذ (7)، وتستطيع المجموعة والآخرون القراءة والتنفيذ (5). هذه المجموعة القياسية للمجلدات والسكريبتات.

ما الفرق بين chmod وchown؟

يغيّر chmod الصلاحيات (ما الذي يمكن فعله بالملف)، ويغيّر chown المالك والمجموعة (لمن تعود هذه الصلاحيات).

كيف أمنح مستخدماً صلاحيات sudo؟

في Ubuntu وDebian أضفه إلى مجموعة sudo بالأمر sudo usermod -aG sudo اسم_المستخدم، وفي أنظمة RHEL إلى مجموعة wheel. تسري التغييرات بعد تسجيل الخروج والدخول من جديد.

ما الصلاحيات 4755 وبت SUID؟

الرقم الأول 4 يفعّل SUID: يُشغَّل البرنامج بصلاحيات مالك الملف، لا بصلاحيات من شغّله. هكذا يعمل مثلاً الأمر passwd، وفي مخرجات ls يظهر الحرف s مكان صلاحية التنفيذ للمالك.

لماذا يستطيع root قراءة ملف صلاحياته 000؟

لأن النواة لا تفحص صلاحيات القراءة والكتابة العادية بالنسبة إلى root. يمكن تقييده بآليات أخرى مثل SELinux وAppArmor، أو بالسمة chattr +i.

تعلّم هذا الموضوع بالفيديو

يُشرح هذا الموضوع بالتفصيل مع التطبيق العملي في دورة «Linux: с нуля до уверенного администрирования».

الانتقال إلى الدورة