حاسبة chmod
تحوّل أذونات ملفات يونكس بين الثماني (755) والرمزي (rwxr-xr-x) وشبكة من مربعات الاختيار، حيث القراءة 4 والكتابة 2 والتنفيذ 1، مع setuid وsetgid وبت sticky.
| الفئة | قراءة | كتابة | تنفيذ |
|---|---|---|---|
| المالك | |||
| المجموعة | |||
| الآخرون |
chmod 644 filechmod u=rw,g=r,o=r file-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 صحيح على مجلد وعديم الجدوى على ملف، وأنت وحدك تعرف أيهما لديك.
ما تعنيه chmod 755
هذا هو الوضع الذي ينتهي إليه كل سكربت وبرنامج ومجلد تقريبًا، ويُقرأ فئة واحدة في كل مرة. كل رقم هو أذونات تلك الفئة الثلاثة مجموعة معًا — القراءة 4، والكتابة 2، والتنفيذ 1 — فالسبعة هي الثلاثة كلها، والخمسة هي قراءة وتنفيذ مع إسقاط الكتابة.
- المالك — 7 = 4+2+1. قراءة وكتابة وتنفيذ: يمكنك تحرير الملف وتشغيله.
- المجموعة — 5 = 4+0+1. قراءة وتنفيذ بلا كتابة: يستطيع أعضاء مجموعة الملف قراءته وتشغيله، ولا يستطيعون تغييره.
- الآخرون — 5 = 4+0+1. الأمر نفسه مرة أخرى: يستطيع كل حساب آخر على الجهاز قراءته وتشغيله، ولا يستطيع أي منهم تغييره.
ومكتوبًا بالحروف هو rwxr-xr-x، والأمر هو chmod 755 file — أو chmod u=rwx,g=rx,o=rx file إن كانت الحروف أيسر عليك. وعلى المجلد تُقرأ البتات نفسها قراءة أخرى، لأن التنفيذ هناك يعني أنك تستطيع الدخول والوصول إلى ما بداخله: فـ755 مجلد يستطيع الجميع سرده والدخول إليه، بينما لا يستطيع إضافة المدخلات أو حذفها إلا المالك. ولا تقول الآلة الحاسبة شيئًا عن 755 على الإطلاق، وذلك مقصود — فهو أضيق وضع يتيح للحسابات الأخرى تشغيل ما كتبته. وإن احتاجت المجموعة إلى تحرير الملف أيضًا فالوضع الذي يضيف كتابة المجموعة هو 775، لا 777.
ما تعنيه chmod 644، ولماذا ملفاتك عليه أصلًا
644 هو 755 منزوعًا منه كل بتات التنفيذ: 6 = 4+2 للمالك، ثم 4 = 4+0+0 للمجموعة و4 مرة أخرى للآخرين، أي rw-r--r--. لا يستطيع أحد تشغيله، وهذا هو الصواب تمامًا لكل ما يُقرأ فقط — مستند، أو صفحة HTML، أو ملف إعدادات، أو ملف مصدري يترجمه برنامج آخر. أما على المجلد فهو ليس مقيّدًا بل معطوبًا: فبلا تنفيذ لا يستطيع شيء الدخول، فتُسرَد الأسماء بالداخل ولا يُفتَح منها واحد.
وهو أيضًا الوضع الذي يكون عليه الملف الجديد عادة قبل أن يمسه أحد، والسبب هو umask. فالبرنامج الذي ينشئ ملفًا يطلب عادة 666 والذي ينشئ مجلدًا يطلب 777، ثم يمحو umask البتات التي يسميها قبل أن يوجد الملف. ومع umask الشائع 022 — تُمنع الكتابة عن المجموعة وعن الآخرين — يصبح 666 هو 644 و777 هو 755، ولهذا يوجد هذان في كل مكان، ولهذا هما أول وضعين تعرضهما هذه الأداة. اكتب umask في الصدفة لترى القيمة التي عندك.
- umask 022، الإعداد المبدئي المعتاد — يخرج الملف الجديد 644 والمجلد الجديد 755.
- umask 002، ويُضبط حيث لكل مستخدم مجموعة خاصة به — 664 و775، فيستطيع أعضاء المجموعة التحرير أيضًا.
- umask 077، الإعداد الخاص — 600 و700، ولا يستطيع أحد غير المالك حتى قراءتهما.
والستة كلها أوضاع جاهزة هنا، وليس هذا محض مصادفة: فهي ثلاثة أقنعة umask يضبطها الناس فعلًا، مطبَّقة مرة على ملف ومرة على مجلد. وقراءتها ثلاثة أزواج لا ستة قيم أسرع طريقة للتوقف عن البحث عن الأوضاع.
ما تعنيه chmod 711: ادخل ولا تنظر
711 هو الوضع الشائع الذي يمنح التنفيذ دون القراءة: 7 = 4+2+1 للمالك، ثم 1 = 0+0+1 مرتين، أي rwx--x--x. ولا يصير مفهومًا إلا حين تفصل إذني المجلد مرة أخرى — فالقراءة تسرد الأسماء والتنفيذ يتيح المرور — ولذلك يستطيع الدخول إلى مجلد على 711 كل من يعرف مسبقًا اسم ما يريده، ولا يستطيع سرده أحد.
- وعلى المجلد هذا مفيد حقًا. فمجلد المنزل على 711 يتيح لخادم ويب، أو لحساب آخر على جهاز مشترك، أن يفتح /home/you/public/report.pdf بينما يُرفض ls /home/you. ولا يُخفى شيء عن المالك؛ إنما لا يستطيع غيره تعداد الأسماء.
- وعلى الملف يكاد يكون بلا فائدة. فتشغيل سكربت الصدفة يعني أن مفسّرًا يفتح الملف ويقرأه، فيفشل التنفيذ دون القراءة؛ ولا يبقى يعمل إلا ملف ثنائي مترجَم تحمّله النواة بنفسها. وإن كنت تريد سكربتًا يشغّله غيرك فالذي تريده 755.
ولا تقول الآلة الحاسبة شيئًا عن 711 كذلك، لأنه أضيق من 755 وليس أوسع: فهو لا يمنح شيئًا لا يمنحه 755. ويظهر جيرانه للسبب نفسه — 751 يمنح المجموعة السرد الممنوع عن الآخرين، و700 يمنع حتى المرور، وهذا ما يريده مجلد مخصص لحساب واحد.
777 و1777: بت واحد بينهما، ونصيحتان مختلفتان
الوضعان اللذان يجتذبهما المجلد المشترك يفترقان ببت واحد، وهذه الأداة تجيب عنهما جوابين مختلفين عن قصد. 777 هو rwxrwxrwx وتشير الأداة إليه كخطر؛ و1777 هو rwxrwxrwt، ويعود ملاحظة عادية، وهو أحد الأوضاع الجاهزة أعلاه — إنه الوضع الذي عليه /tmp فعلًا.
- 777 — كل رقم هو 4+2+1: قراءة وكتابة وتنفيذ للمالك والمجموعة وكل من عداهما. ولم يبقَ ما يحمي شيئًا: فأي حساب يستطيع إعادة كتابة الملف، وأي حساب يستطيع حذف مدخل أو استبداله في مجلد يحمله. إنه الإصلاح التلقائي لمشكلة أذونات، وهو في الغالب دائمًا يستبدل مشكلة صغيرة بمشكلة حقيقية.
- 1777 — البتات التسعة نفسها مضافًا إليها بت sticky، الذي لا يسمح بحذف مدخل أو إعادة تسميته إلا لمالك ذلك المدخل. وهذا القيد الواحد هو ما يجعل ترك مجلد قابلًا للكتابة من الجميع آمنًا، وهو سبب عمل /tmp: يستطيع كل أحد إنشاء ملف هناك، ولا يستطيع أحد إزالة ملف غيره.
ولا يصح هذا الفرق إلا حيث يملك الآخرون التنفيذ أيضًا، والأداة صارمة في ذلك. 1666 هو rw-rw-rwT — بت sticky مضبوط حيث لا تنفيذ لأي فئة — ولا يمكن لشيء على هذه الصورة أن يكون مجلدًا صالحًا، فلا يحمي بت sticky شيئًا وتشير الأداة إلى الوضع بوصفه قابلًا للكتابة من الجميع بأعلى درجة، كما تشير إلى 666 بالضبط. والحرف الكبير T يقول الشيء نفسه بحرف واحد.
فالمجلد الذي لا بد أن يكون مشتركًا يريد 1777، أو أحسن من ذلك 775 مع المجموعة الصحيحة، والملف الذي لا يُفتَح هو في الغالب مشكلة ملكية لا حالة تستوجب 777.
الأسئلة الشائعة
- ما الفرق بين 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 تغييره، ولذلك يُتجاهَل.
- هل يُرسَل أي شيء أُدخله إلى خادم؟
- لا. الأداة بأكملها حساب يجري في متصفحك. لا يُرفع شيء ولا يُسجَّل ولا يُخزَّن، وهذا أيضًا سبب عملها دون أي اتصال بالشبكة إطلاقًا.
- ماذا يفعل chmod 711؟
- يمنح المالك كل شيء، ويمنح المجموعة وكل من عداها التنفيذ وحده — rwx--x--x. وعلى المجلد يعني ذلك أنهم يستطيعون المرور به إلى مسار يعرفونه مسبقًا، ولا يستطيعون سرد ما فيه، وهذا ما يريده مجلد منزل على جهاز مشترك عادة. وعلى الملف ليس مفيدًا: فسكربت الصدفة لا بد أن يقرأه مفسّره ليعمل، فالتنفيذ دون القراءة يفشل ببساطة.
- ما الفرق بين chmod 777 وchmod 1777؟
- بت واحد — بت sticky، ويُكتب واحدًا في المقدمة، ويحوّل الحرف الأخير من x إلى t. كلاهما يمنح كل حساب قراءة وكتابة وتنفيذًا؛ ويسمح 1777 فوق ذلك بحذف مدخل أو إعادة تسميته لمالكه وحده. ولهذا تشير الأداة إلى 777 بأنه نادرًا ما يكون صحيحًا، وتسمي 1777 الوضع المعتاد لمجلد مشترك مثل /tmp.
- لماذا تخرج الملفات الجديدة 644 والمجلدات الجديدة 755؟
- بسبب umask. فالبرنامج الذي ينشئ ملفًا يطلب 666 والذي ينشئ مجلدًا يطلب 777، ويمحو umask بتاتٍ من ذلك قبل أن يوجد الملف. والقيمة المعتادة 022 تمنع الكتابة عن المجموعة وعن الآخرين، فيبقى 644 و755. شغّل umask في الصدفة لترى قيمتك: 002 يعطي 664 و775، و077 يعطي 600 و700.
- ماذا تعني rwxr-xr-x؟
- إنها 755 مكتوبة بالحروف. اقرأها ثلاثة أحرف في كل مرة: rwx هي المالك، بقراءة وكتابة وتنفيذ؛ وr-x هي المجموعة، بقراءة وتنفيذ دون كتابة؛ وr-x مرة أخرى هي كل من عداهم. والشرطة تعني أن ذلك الإذن مطفأ. الصق السلسلة في حقل «رمزي» هنا فيُظهر مربع «ثماني» القيمة 755.
أدوات ذات صلة
- حاسبة CIDR والشبكات الفرعية
حلّل شبكة، وتحقق من الانتماء، وقسّمها.
- شارح تعبيرات cron
اقرأ تعبير cron واعرف متى يعمل فعلًا.
- ما هو عنوان IP الخاص بي
عنوانا IPv4 و IPv6 العامّان، وأيّهما اختار متصفحك.
- محوّل طوابع زمن Unix
يحوّل زمن epoch إلى تاريخ، والعكس.