حق دسترسی فایل‌ها در لینوکس به زبان ساده

بارها برام پیش اومده که موقع تغییر فایل‌های لینوکس به خاطر مجوز اونها به مشکل خوردم. تصمیم گرفتم یکبار با دقت این مجوزها رو بخونم و به زبان ساده در وبلاگم بنویسم. البته این راهنما قرار نیست کامل باشه و بیشتر یک یادداشته برای مراجعات بعدی خودم.

اگر در یک ترمینال دستور ls -l یا ll رو تایپ کنیم چیزی شبیه به این می‌بینیم:

mehdix@spielplatz:~/Desktop/perm$ ls -l
total 4
drwxrwxr-x 2 mehdix mehdix 4096 Jan  8 09:38 dir1
-rw-rw-r-- 1 mehdix mehdix    0 Jan  8 09:38 file1

حق دسترسی و مالکیت دو موضوع تقریبا مستقل از هم هستند. ستون اول خروجی دستور بالا حق دسترسی روی فایل و پوشه موجود رو نشون می‌ده ولی ستون‌های سوم و چهارم حق مالکیت بر روی فایل‌ها رو نشون می‌ده. لازمه بگم که پوشه هم یک جور فایل است با این تفاوت که آدرس فایل‌های دیگر رو درون خودش نگه می‌داره (مراجعه کنید به inode). در ادامه هر دو رو شرح می‌دیم.

مالکیت

وقتی یک فایل یا پوشه رو با دستورات و اپراتورهای مختلف از جمله mkdir (بخوانید make directory) و touch و echo و < و << (این دو تا رو نمی‌دونم چطور بخونیم!) می‌سازیم مالکیت فایل تولیدی هم به ما داده می‌شه. در مثال بالا ستون سوم مالک رو نشون می‌ده و ستون چهارم هم گروه کاربری رو. معنی مالک در لینوکس مثل معنی اون در دنیای واقعی است. یعنی مالک تصمیم می‌گیره چه کسی به فایل اون بتونه «نگاه» کنه یا «دست بزنه». می‌تونید تصور کنید که پدر مالک ماشینه و اون تصمیم می‌گیره که اجازه بده که فرزندش به ماشین فقط نگاه کنه یا پشت فرمون هم بشینه. نکته مهم اینجا اینه که مالک یک فایل تصمیم می‌گیره که حق دسترسی‌های‌ اون فایل چی باشه. جالبه بدونید که مالک می‌تونه حق دسترسی خواندن و نوشتن و اجرا کردن خودش رو هم روی فایل محدود کنه اما از جایی که مالکیت فایل رو در اختیار داره می‌تونه دوباره اون رو سر جاش برگردونه. پس یادمون می‌مونه که حق مالکیت جدا از حق دسترسی است.

گروه کاربری

هر فایلی حتما یک مالک داره که حق دسترسی‌های اون رو تعیین می‌کنه اما علاوه بر این هر فایلی به یک گروه هم تعلق داره. یک گروه نماینده کاربرانی است که حقوقی متفاوت از کاربر عادی در دسترسی به فایل‌ها دارند. یعنی بواسطه گروهشون به فایل‌هایی دسترسی داشته باشند که کاربرشون به تنهایی نداره. یک کاربر می‌تونه در بیش از یک گروه عضو باشه اما یک فایل فقط می‌تونه متعلق به یک گروه باشه. در مثال بالا هم ستون چهارم گروه کاربری رو نشون می‌ده. روی کامپیوتر اوبونتوی من که یک کاربر بیشتر نداره (البته به استثنای کاربر root) کاربر و گروه کاربری من یکیه. هر کاربر حتما باید عضو یک گروه باشه بنابراین به طور پیشفرض یک گروه بنام خود کاربر روی سیستم موقع نصب ساخته شده. گروه کاربری وقتی به درد می‌خوره که با بیش از یک کاربر سر و کار داشته باشیم. مثلا بخوایم به همه کاربرهایی که اعتماد داریم اجازه خواندن و نوشتن بدیم و به سایر کاربرهای سیستم فقط اجازه خواندن بدیم. در این صورت می‌تونیم گروهی که کاربران مورد اعتماد ما عضوش هستند رو به عنوان گروه فایل تنظیم کنیم.

تغییر مالک و گروه کاربری فایل‌ها با chown

هر کاربر می‌تونه حقوق دسترسی روی یک فایل رو که در مالکیت اوست تغییر بده اما نمی‌تونه مالکیت فایل رو تغییر بده. این کار باید توسط کاربر root انجام بشه. در ضمن وقتی ما از دستور root استفاده می‌کنیم (در سیستم‌های مشابه دبیان) داریم با دسترس کاربر روت تغییرات رو انجام می‌دیم. هرچند یک کاربر می‌تونه گروه کاربری یک فایل رو به گروهی جدید تغییر بده به شرط اینکه خودش عضو گروه جدید باشه. به عبارت دیگه یک کاربر می‌تونه گروه یک فایل رو بین گروه‌هایی که خودش عضو اونهاست دست به دست کنه.

دستور اصلی برای تغییر مالکیت فایل‌ها chown است (بخوانید change owner) به این ترتیب:

chown username:groupname file1 file2 [or directory]

در دستور بالا username نام کاربری است که می‌خواهیم فایل‌ها به اون تعلق داشته باشند و نیز groupname نام گروهی است که می‌خواهیم فایل‌ها به آن تعلق داشته باشند.

این دستور رو به دو شیوه دیگر هم می‌شه اجرا کرد. فقط برای تغییر مالک فایل به شکل زیر:

chown username file1 file2 [or directory]

و تنها برای تغییر گروه فایل به این شکل (دو نقطه فراموش نشود):

chown :groupname file1 file2 [or directory]

برای تغییر گروه دستور chgrp را هم می‌توان بکار برد (بخوانید change group):

chgrp groupname file1 file2 [or directory]

با بکارگیری فلگ -R تغییرات به همه زیرشاخه‌ها هم اعمال خواهد شد:

chown -R username:groupname directory

حق دسترسی‌ برای فایل‌ها

برای هر فایل می‌شه سه نوع حق‌دسترسی تعریف کرد: حق‌نوشتن و حق خواندن و حق اجرا کردن فایل.

  • حق خواندن یعنی دیدن محتوای فایل و استفاده از دستوراتی مانند less و cat و غیره. حق خواندن با r نشان داده می‌شود.

  • حق نوشتن یعنی تغییر محتویات فایل. فوروارد کردن خروجی یک دستور به یک فایل و اضافه کردن به فایل و مانند اینها. حق خواندن با w نشان داده می‌شود.

  • حق اجرای فایل اگر ما روی یک فایل حق اجرا داشته باشیم می‌توانیم از سیستم عامل بخواهیم که آن فایل را مثل یک برنامه برای ما اجرا کند. اگر فایل باینری باشد حق اجرا کفایت می‌کند اما اگر فایل اسکریپت باشد از جایی که باید یک برنامه دیگر آنرا بخواند و اجرا کند علاوه بر حق اجرا حق خواندن نیز لازم است. حق خواندن با x نشان داده می‌شود.

حق دسترسی برای پوشه‌ها

برای هر پوشه هم می‌شود سه نوع حق دسترسی تعریف کرد. خواندن و نوشتن و ‫جستجو. این معانی با قبلی‌ها تفاوت دارند.

  • حق خواندن به معنای دیدن لیست فایل‌های درون یک پوشه است با بکارگیری دستوری مانند ls (بخوانید list ). هرچند این به معنی خواندن محتوای فایل‌های داخل آن نیست.

  • حق نوشتن به معنی امکان افزودن‌ فایل‌های جدید به پوشه و همچنین تغییر نام و انتقال فایل‌های موجود است، برای مثال با دستور mv.

  • حق اجرا روی یک پوشه به معنی اینست که پوشه قابل جستجو است و می‌توان نام آنرا برای دسترسی به یک فایل دارای حق اجرا بکار برد.

تغییر دسترسی‌ها با chmod

یک کاربر می‌تونه حق خواندن و نوشتن و اجرای فایل‌هایی که تحت مالکیت خودش قرار دارند رو تغییر بده. همونطور که در بالا گفتیم rwx حرف اول مجوزهایی هستند که برای هر فایل بکار می‌ره. برای هر فایل سه دست حق دسترسی تعریف شده، هر دست شامل مجوز خواندن و نوشتن و اجرا است. یک دست برای مالک و یک دست برای گروه و یک دست برای سایر کاربران. در مجموع نه بیت برای اینکار بکار رفته که هر سه بیت یک دست حق دسترسی رو نشون می‌ده. هر بیت اگر ست شده باش (یعنی مقدر ۱ بهش داده شده باشه) بسته به اینکه بیت خواندن یا نوشتن یا اجرا باشه با r و w و x نشون داده خواهد شد. حالا با مراجعه دوباره به لیستی که اول نوشته داشتیم اینها رو مرور می‌کنیم:

mehdix@spielplatz:~/Desktop/perm$ ls -l
total 4
drwxrwxr-x 2 mehdix mehdix 4096 Jan  8 09:38 dir1
-rw-rw-r-- 1 mehdix mehdix    0 Jan  8 09:38 file1

در مثال بالا خط‌های تیره در ستون اول نماینده بیت‌هایی هستند که ست نشده‌اند (مقدارشان صفر است). به ترتیب از چپ به راست اولین بیت اگر d باشد یعنی یک پوشه است اگر l باشد یعنی لینک سمبلیک است و اگر - باشد یعنی فایل معمولی است. نه سه تای بعدی مجوزهای مالک سه تای دوم مجوزهای گروه و سه تای سوم مجوزهای سایر کاربران هستند.

برای این منظور از دستور chmod ‏‎(بخوانید change mode) استفاده می‌کنیم:

chmod [references][operator][modes] file1 ...

در دستور بالا references برای انتخاب سِت مورد نظر است، مالک و/یا گروه و/یا سایر کاربران. جدول زیر نشاندهنده حروفی است که به این منظور بکار می‌رود:

رفرنس کلاس شرح
u user مالک فایل
g group کاربرانی که عضو گروه فایل هستند
o other کاربرانی که عضو گروه فایل نیستند
a all همه موارد بالا

در ادامه با مثال کاربرد این حروف را می‌بینیم. اوپراتورها هم یا + یا - یا = هستند:

  • به علاوه + به معنی افزودن یک ‫مود به رفرنس‌های نامبرده است
  • منها - به معنی حذف یک مود از رفرنس‌های نامبرده است
  • مساوی = به معنی اعمال یک مود به همه رفرنس‌هاست

مودها یا حالت‌ها هم همان حق خواندن و نوشتن و اجرا هستند که البته سه مود دیگر بنام‌های X (با حرف بزرگ) و s و t هم داریم که فعلا به آنها نمی‌پردازیم.

حالا چند مثال. فایل یک از مثال بالا را تغییر می‌دهیم:

chmod ug+rw file1

یعنی به کاربر مالک و گروه مالک حق خواندن و نوشتن را اضافه کن و این شد نتیجه:

-rw-rw-r-- 1 mehdix mehdix 0 Jan  8 10:20 file1

حالا همون حقوقی رو که خودمون دادیم پس می‌گیریم :) به این شکل:

chmod ug-rw file1

و این هم نتیجه:

-------r-- 1 mehdix mehdix 0 Jan  8 10:20 file1

یا مثلا گرفتن و دادن همه مجوزها به همه کاربران:

chmod a+rw file1
chmod a-rw file1

یا مثلا دادن تنها امکان خواندن به سایر کاربران:

chmod o=r file1

دقت کنید که بکارگیری = باعث از بین رفتن مجوزهای قبلی می‌شه در حالی که + و - مجوزها رو اضافه و حذف می‌کنند و کاری به بقیه ندارند. این‌ها در حقیقت همون عملیات and و or و mask کردن بیت‌ها در کامپیوتره.

نوشتن این یادداشت باعث شد خودم بهتر این موارد رو به خاطر بسپرم. موارد بیشتری هم هست که بهرحال فهم این نکات اولیه به یادگیری بقیه هم کمک می‌کنه. منابعی هم که بکار گرفتم در انتهای مطلب1234 هست.