حاسبة chmod

تحوّل أذونات ملفات يونكس بين الثماني (755) والرمزي (rwxr-xr-x) وشبكة من مربعات الاختيار، مع setuid وsetgid وبت sticky.

الأوضاع الشائعة
الفئةقراءةكتابةتنفيذ
المالك
المجموعة
الآخرون
ثماني
رمزي
أمر ثماني
chmod 644 file
أمر رمزي
chmod u=rw,g=r,o=r file
نمط ls -l
-rw-r--r--

ما الذي تفعله هذه الأداة

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

كل شيء يعمل في متصفحك وهو حساب محض: لا يوجد خادم، ولا يُرسَل أي شيء تكتبه إلى أي مكان. إنها آلة حاسبة ومرجع، وليست وسيلة لتغيير الأذونات على جهاز حقيقي — لذلك تنسخ أمر chmod الذي تنتجه وتشغّله بنفسك.

ثلاث فئات، ثلاثة أذونات

تنتظم الأذونات في ثلاث فئات من ثلاثة. الفئات الثلاث هي مالك الملف، والمجموعة التي يملكه، وكل من عداهم — «الآخرون». وداخل كل فئة ثلاثة أذونات: القراءة والكتابة والتنفيذ.

  • القراءة (r) — الاطلاع على محتوى الملف، أو سرد مدخلات المجلد.
  • الكتابة (w) — تغيير الملف، أو إضافة مدخلات وحذفها في المجلد.
  • التنفيذ (x) — تشغيل الملف كبرنامج، أو الدخول إلى مجلد والوصول إلى الملفات داخله.

يعني التنفيذ شيئًا مختلفًا للمجلد عمّا يعنيه للملف، وهذا ما يوقع الناس: مجلد يمكنك قراءته دون تنفيذه يتيح لك رؤية أسماء ما بداخله دون أن تفتح أيًا منها.

كيف يعمل العدد الثماني

تنضغط أذونات كل فئة الثلاثة في رقم ثماني واحد بجمع قيم ثابتة: القراءة 4، والكتابة 2، والتنفيذ 1. فالقراءة والكتابة والتنفيذ تساوي 4+2+1 = 7؛ والقراءة والتنفيذ تساوي 4+1 = 5؛ والقراءة والكتابة تساوي 4+2 = 6. وثلاث فئات تعطي ثلاثة أرقام.

755
7 = 4+2+1   # المالك: قراءة + كتابة + تنفيذ
5 = 4+0+1   # المجموعة: قراءة + تنفيذ
5 = 4+0+1   # الآخرون: قراءة + تنفيذ

فـ755 تعني «المالك يستطيع كل شيء، وسائر الناس يقرأون ويشغّلون لكن لا يغيّرون»، وهو الوضع المعتاد لبرنامج أو مجلد. أما 644 — قراءة وكتابة للمالك، وقراءة فقط لغيره — فهو الوضع المعتاد لملف عادي. وحين يألف المرء النمط تُقرأ الأوضاع الشائعة بنظرة واحدة.

السلسلة الرمزية

الكتابة الأخرى هي التي يطبعها ls -l: تسعة أحرف، ثلاثة لكل فئة، كل حرف إما حرفه أو شرطة. فـ755 هي rwxr-xr-x، و644 هي rw-r--r--. وهي تحمل المعلومات نفسها التي يحملها العدد الثماني بالضبط، لكنها مبسوطة بحيث ترى كل إذن بدلًا من جمع الأرقام ذهنيًا.

ولسطر ls -l حرف عاشر في مقدمته — d للمجلد، وشرطة للملف العادي، وl للرابط الرمزي. هذا الحرف الأول هو نوع الملف لا إذنًا من أذوناته، ولا يستطيع chmod تغييره. ويمكنك لصق حقل الأذونات كاملًا من ls -l هنا فيُتجاهَل حرف النوع ببساطة.

البتات الخاصة: setuid وsetgid وsticky

فوق البتات التسعة العادية تقع ثلاثة بتات خاصة، تُكتب رقمًا ثمانيًا رابعًا اختياريًا في المقدمة — setuid‏ (4) وsetgid‏ (2) وبت sticky‏ (1). وليس لها عمود خاص بها؛ بل يعلو كل منها خانة تنفيذ في السلسلة الرمزية، ومن هنا تأتي الحروف الكبيرة التي يجدها الناس محيّرة.

  • يجعل setuid على ملف تنفيذي يعمل بهوية مالك الملف بدلًا من هوية المستخدم الذي شغّله. وهكذا يستطيع passwd تحديث ملف نظام لا تملك الكتابة إليه مباشرة — ولهذا فإن برنامج setuid فيه خلل يمثل ثغرة خطيرة.
  • ويشغّل setgid الملف التنفيذي بمجموعة الملف. أما على المجلد فيفعل شيئًا أنفع وأأمن: ترث الملفات الجديدة المنشأة بداخله تلك المجموعة بدلًا من مجموعة منشئها.
  • ويعني بت sticky على مجلد أن مالك الملف وحده يستطيع حذفه أو إعادة تسميته، حتى حين يستطيع الجميع الكتابة في المجلد. وهذا ما يُبقي /tmp مشتركًا وآمنًا في آن. أما على ملف عادي فلا يفعل شيئًا.

وفي السلسلة الرمزية يحوّل البت الخاص المضبوط خانة تنفيذه إلى حرف: s في خانة المالك لـsetuid، وs في خانة المجموعة لـsetgid، وt في خانة الآخرين لـsticky. وحالة الحرف تخبرك إن كان التنفيذ مفعّلًا أيضًا — الصغير يعني نعم، والكبير يعني لا.

rwsr-xr-x  4755   # setuid، والمالك ينفّذ
rwSr-xr-x  4655   # setuid، لكن المالك لا ينفّذ
rwxrwxrwt  1777   # sticky، والآخرون ينفّذون
rwxrwxrwT  1776   # sticky، لكن الآخرين لا ينفّذون

والحرف الكبير S أو T خطأ في الغالب دائمًا: فهو يعني أن بتًا خاصًا ضُبط على ملف غير قابل للتنفيذ، فلم يبقَ للبت ما يعمل عليه.

الصيغة الثمانية أو الرمزية في سطر الأوامر

يقبل chmod الصيغتين، وهذه الأداة تكتبهما معًا. تضبط الصيغة الثمانية كل البتات دفعة واحدة: chmod 755 file. وتفعل صيغة = الرمزية الشيء نفسه على نحو مطلق — chmod u=rwx,g=rx,o=rx file — إذ تسرد كل فئة حتى لا تتوقف النتيجة على ما كان عليه الملف من قبل.

وثمة صيغة ثالثة نسبية لا تحتاجها الحاسبة لكنك ستصادفها: chmod +x file يضيف التنفيذ للجميع، وchmod g-w file ينزع الكتابة من المجموعة، وchmod o= file يمسح كل شيء عن الآخرين. تغيّر هذه الصيغة البتات نسبةً إلى الوضع الحالي بدلًا من ضبط الوضع كله، وهو أمر مريح في سطر الأوامر لكن ليس له «نتيجة» واحدة تُعرض.

أوضاع يُستحسن عدم ضبطها

ينبغي لأداة أذونات أن تقول أيضًا متى يكون الوضع فكرة سيئة. واثنان يتكرران باستمرار:

  • 777 يمنح كل مستخدم القراءة والكتابة والتنفيذ. وهو الإصلاح التلقائي حين لا يعمل شيء ما، وهو يبادل في الغالب مشكلة صغيرة بثغرة أمنية حقيقية. والوضع الصحيح أضيق منه دائمًا تقريبًا — عادة 755 أو 644.
  • وأي ملف قابل للكتابة من الجميع (الرقم الأخير يتضمن 2) يتيح لأي حساب على الجهاز إعادة كتابة محتواه. وبالنسبة لكل ما يُشغَّل أو يُحمَّل أو يُوثَق به، فتلك طريق للدخول. امنح الكتابة لمجموعة بدلًا من ذلك، أو أبقها للمالك وحده.

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

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

ما الفرق بين 644 و755؟
‏644 هو قراءة وكتابة للمالك وقراءة فقط لسائر الناس، وهو الوضع المعتاد لملف عادي. أما 755 فيضيف التنفيذ للفئات الثلاث، وهو ما يحتاجه البرنامج ليعمل وما يحتاجه المجلد ليُدخَل إليه. استخدم 644 للمستندات وملفات الشيفرة، و755 للسكربتات والمجلدات.
لماذا أظهر وضعي حرف S أو T كبيرًا؟
لأن بتًا خاصًا ضُبط على فئة لا تملك إذن التنفيذ. فالحرف s أو t الصغير يعني أن البت الخاص والتنفيذ كليهما مفعّل؛ أما الصيغة الكبيرة فتعني أن البت الخاص مفعّل والتنفيذ غير مفعّل، وهو ما يدل عادة على أن الوضع ليس المقصود — فمثلًا 4644‏ (rwSr--r--) هو setuid على ملف لا يستطيع أحد تنفيذه.
ماذا يفعل chmod 777 فعليًا، ولماذا لا يُنصح به؟
يمنح القراءة والكتابة والتنفيذ للمالك وللمجموعة ولكل من عداهما — وصولًا كاملًا لكل حساب على النظام. ولا يُنصح به لأنه يزيل كل حماية دفعة واحدة؛ فالملف الذي يستطيع الجميع الكتابة فيه ملف يستطيع أي أحد العبث به، والمجلد الذي يستطيع الجميع الكتابة فيه مجلد يستطيع أي أحد أن يزرع فيه ملفات. وتُحَل كل حالة تقريبًا تلجأ إلى 777 بـ755 أو 644 مع الملكية الصحيحة.
هل يجب أن يكون الرقم الأول موجودًا؟
لا. حين لا يكون أي من البتات الخاصة مضبوطًا، يكون الوضع ثلاثة أرقام فحسب — 755 لا 0755 — وهذا ما تعرضه الأداة. ويُقبل الصفر في المقدمة ويعني الشيء نفسه؛ أما 4 أو 2 أو 1 في المقدمة فتشغّل setuid أو setgid أو بت sticky على الترتيب.
هل يمكنني لصق سطر مباشرة من ls -l؟
نعم. الصق حقل الأذونات المكوّن من عشرة أحرف، مثل ‎-rwxr-xr-x‎ أو drwxr-xr-x، فتزيل الأداة حرف النوع الأول وتقرأ الباقي. فالنوع (ملف أو مجلد أو رابط) ليس إذنًا ولا يستطيع chmod تغييره، ولذلك يُتجاهَل.
هل يُرسَل أي شيء أُدخله إلى خادم؟
لا. الأداة بأكملها حساب يجري في متصفحك. لا يُرفع شيء ولا يُسجَّل ولا يُخزَّن، وهذا أيضًا سبب عملها دون أي اتصال بالشبكة إطلاقًا.