chmod - تغییر سطح دسترسی فایلها و فولدرها

chmod مخفف عبارت Change Mode به معنای تغییر در سطح دسترسی فایل‌ها و فولدرها می‌باشد.

همان‌طور که می‌دانیم لینوکس یک سیستم عامل چند کاربره است. در لینوکس، هر فایل یا فولدر دارای یک سطح دسترسی مشخص برای هر کاربر است. یکی از علل امنیت بالاتر لینوکس نسبت به ویندوز همین مشخص بودن سطح دسترسی برای هر کاربر است. در زیر مفاهیم کاربر (user)، اجازه ها (permissions)، صاحب (owner) و گروه (group) را مشخص می‌کنیم و بعد دستور chmod را توضیح می‌دهیم.

کاربر: هر کسی که از کامپیوتر استفاده می‌کند یک کاربر نامیده می‌شود و دارای یک نام است که معمولا در ابتدای نصب سیستم عامل، این نام مشخص می‌شود و فرد، موقع ورود به سیستم با این نام وارد می‌شود. با استفاده از دستور whoami می‌توان نام کاربری را به دست آورد.

اجازه‌ها (سطح دسترسی): هر کاربر برای هر فایل یا فولدر دارای سه نوع سطح دسترسی خواندن (read)، نوشتن (write) و اجرا کردن (execute) است. این سطوح دسترسی برای فایل و فولدر کمی متفاوت است. برای فایل‌ها، خواندن به معنای باز کردن فایل و دیدن محتویات آن است، نوشتن به معنای تغییر در محتویات فایل است و اجرا کردن هم که فقط برای فایل‌های اجرایی و یا اسکریپت است، به معنای اجرا شدن آن برنامه است. برای فولدرها، خواندن به معنای لیست کردن فایل‌های درون آن فولدر است، نوشتن به معنای ساختن یا پاک کردن فایل‌ها درون فولدر است و اجرا کردن به معنای اجازه ورود به فولدر و زیر فولدرها است.

صاحب: در حالت کلی به کاربری که فایل یا فولدری را ایجاد میکند صاحب آن فایل‌ها و فولدرها گفته می‌شود.

گروه: هر کاربر ممکن است به یک یا چند گروه تعلق داشته باشد. مثلا ممکن است نام کاربری majid هم به گروه majid و هم به گروه root و هم به گروه sambashare تعلق داشته باشد. در این صورت، اگر اجازه‌هایی را برای گروه sambashare در نظر بگیریم، برای آن کاربر هم منظور می‌شود. همانطور که متوجه شدید، می‌توان نام کاربری و نام گروه یکسانی داشت.

نکته: هر کاربری که در هیچکدام از دو دسته ی گروه و کاربر قرار نداشته باشد، به آن دیگران (others) گفته می‌شود.

دستور chmod

نمای کلی دستور:

$ chmod [options] [mode] [file]
$ chmod [options] [octal-mode] [file]

options: پارامترهایی که برای تغییر سطح دسترسی به دستور می‌دهیم.

mode: نوع سطح دسترسی

octal-mode: عددی در مبنای ۸ که نوع سطح دسترسی را مشخص می‌کند (حالت جایگزین برای mode).

file: فایلی که می‌خواهیم تغییرات را روی آن انجام دهیم.

فرض کنید در پوشه home/majid/ فولدری داریم به نام myFolder که حاوی محتویات زیر است.

File1.txt     File2.txt     File3.txt     File4.txt

حال با دستور cd وارد آن فولدر می‌شویم و با دستور ls و پارامتر l-لیستی از فایل‌های درون آن بدست می‌آوریم.

cd ~/myFolder
ls -l
-rw-rw-r-- 1 majid majid   6 Jan 27 07:52 File1.txt
-rw-rw-r-- 1 majid majid  20 Jan 27 07:53 File2.txt
-rw-rw-r-- 1 majid majid 260 Jan 27 07:53 File3.txt
-rw-rw-r-- 1 majid majid  18 Jan 27 07:54 File4.txt

در ستون اول رشته‌ای ده کاراکتری دیده می‌شود که در زیر آن را توضیح می‌دهیم.

کاراکتر اول مشخص کننده نوع فایل است. در جدول زیر انواع فایل‌ها مشخص شده (دقت کنید که هر چیزی در لینوکس فایل است، حتی فولدرها).

نوع فایل کاراکتر ابتدای رشته
فایل معمولی -
فولدر d
symbolic link l
character special device c
block special device b
FIFO p
socket s

حال فرض کنید فولدری به نام myFolder1 در myFolder داشته باشیم. خط زیر به خروجی ls -lاضافه میشود.

drwxrwxr-x 2 majid majid 4096 Jan 27 08:07 myFolder1

همانطور که می‌بینید، اولین کاراکتر آن به dتغییر کرد.

۹ کارکتر بعدی به ترتیب اجازه خواندن (read)، نوشتن (write) و اجرا کردن (execute) برای به ترتیب صاحب (owner)، گروه (group) و دیگران (others) است. مثلا در خروجی بالا، برای فولدر myFolder1، صاحب دارای دسترسی rwx، گروه دارای دسترسی rwxو دیگران دارای دسترسی x--هستند.

تغییر دادن سطح دسترسی به یک فایل

نمای کلی برای دستور chmod به صورت زیر است:

$ chmod [ugoa][+-][rwx] FILE_NAME

کاراکترهای موجود در کروشه های اول، به ترتیب نشاندهنده کاربر (User)، گروه (Group)، دیگران (Others) و همه (All) می‌باشند. می‌توان یک یا چند کاراکتر از کروشه اول را در کنار هم و بدون در نظر گرفتن ترتیب استفاده کرد (توضیح در مثال پایین). از کاراکترهای +و -موجود در کروشه دوم تنها می‌توان یکی را استفاده کرد که نشان دهنده افزودن یا کاستن سطح دسترسی مورد نظر است. از کاراکترهای rو wو xموجود در کروشه سوم هم می‌توان یک یا چند عدد را به‌کار برد که نشان دهنده نوع دسترسی است.

مثال:

drwxrwxr-x 2 majid majid 4096 Jan 27 08:07 myFolder1
chmod ug-w myFolder1
dr-xr-xr-x 2 majid majid 4096 Jan 27 08:07 myFolder1

در این مثال، دسترسی نوشتن در فولدر myFolder1 را از کاربر و گروه گرفتیم. (دقت کنید که بین ugو wو -فاصله ای وجود ندارد)

-rw-rw-r-- 1 majid majid  20 Jan 27 07:53 File2.txt
chmod o+wx File2.txt
-rw-rw-rwx 1 majid majid  20 Jan 27 07:53 File2.txt

در این مثال به دیگر کاربران دسترسی اجرا کردن و تغییر محتویات فایل را دادیم.

تغییر دادن سطح دسترسی به یک فایل در حالت Octal (مبنای ۸)

می‌توان به ۹ کاراکتری که نشان دهنده سطح دسترسی به فایل هستند آرایه ای از اعداد ۰ و ۱ نسبت داد که صفر بودن به معنای عدم فعال بودن دسترسی آن عضو و یک بودن به معنای فعال بودن دسترسی می‌باشد.

rw-rw-r--
110110100

حال اگر اعداد را سه رقم سه رقم جدا کنیم و به مبنای ۸ ببریم.

rw- rw- r--
110 110 100

6 6 4

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

-rw-rw-r-- 1 majid majid  20 Jan 27 07:53 File2.txt
( 6  6  4 )

chmod 667 File2.txt

-rw-rw-rwx 1 majid majid  20 Jan 27 07:53 File2.txt
( 6  6  7 )

راه راحتتر، استفاده از جدول زیر است

نوع دسترسی عدد اختصاص داده شده
x 1
w 2
r 4

حال کافیست مثلا برای تعیین سطح دسترسی rwx بنویسیم 1+2+4=7

پارامترها:

c-یا changes--: مثل پارامتر v-ولی تنها وقتی اعلام می‌کند که تغییرات حتما انجام شده باشد.

-rw-rw-r-- 1 majid majid  260 Jan 27 07:54 File3.txt
chmod  -c 777 File3.txt
mode of 'File3.txt' changed from 0664 (rw-rw-r--) to 0777 (rwxrwxrwx)

v-یا verbose--: کارهایی که انجام می‌دهد را اعلام می‌کند.

reference=RFILE--: از سطوح دسترسی فایل RFILE به عنوان سطوح اعمالی برای دستور استفاده می‌کند.

-rw-rw-r-- 1 majid majid   20 Jan 27 07:54 File2.txt
-rwxrwxrwx 1 majid majid  260 Jan 27 07:54 File3.txt
chmod --reference=File2.txt File3.txt
-rw-rw-r-- 1 majid majid   20 Jan 27 07:54 File3.txt

R-یا recursive--: اگر اسم فایل مورد نظر، یک فولدر باشد، همه فایل‌ها و فولدرهای داخل آن را با سطوح دسترسی داده شده تغییر می‌دهد.

ls -la
total 96
drwxrwxr-x  3 majid majid  4096 Jan 27 19:35 .
drwx------ 64 majid majid 36864 Jan 27 18:44 ..
-rw-rw-r--  1 majid majid     4 Jan 27 19:35 File1.txt
-rw-rw-r--  1 majid majid    20 Jan 27 07:54 File2.txt
-rw-rw-r--  1 majid majid   260 Jan 27 07:54 File3.txt
-rw-rw-r--  1 majid majid    18 Jan 27 07:54 File4.txt
drwxrwx--x  2 majid majid  4096 Jan 27 08:07 myFolder1
chmod -R 777 .
ls -l myFolder/
-rwxrwxrwx  1 majid majid     4 Jan 27 19:35 File1.txt
-rwxrwxrwx  1 majid majid    20 Jan 27 07:54 File2.txt
-rwxrwxrwx  1 majid majid   260 Jan 27 07:54 File3.txt
-rwxrwxrwx  1 majid majid    18 Jan 27 07:54 File4.txt
drwxrwxrwx  2 majid majid  4096 Jan 27 08:07 myFolder1

در کنار سه نوع اجازه‌نامه خواندن، نوشتن و اجرا کردن، سه نوع دیگر از اجازه‌نامه ها هستند که تاثیرشان بر روی دایرکتوری‌ها و فایل‌ها متفاوت است.

1. suid
فقط بر روی فایل‌های با قابلیت اجرایی تاثیر دارند. اگر بر روی یک فایل با قابلیت اجرایی تنظیم شود، وقتی آن فایل اجرا شود، آن فایل با دسترسی صاحب فایل اجرا می‌شود و نه با دسترسی فردی که فایل را اجرا کرده. مثلا وقتی شما با دستور passwd پسوردتان را تغییر می‌دهید تغییراتی را داخل فایل shaddow ایجاد می‌کنید و از آن‌جایی که ایجاد تغییر در فایل shaddow فقط برای کاربر ریشه میسر است، پس باید دستور passwd با دسترسی ریشه اجرا شود، برای همین بر روی این دستور به طور پیش فرض suid تنظیم شده.
نکته: اگر suid بر روی دستوراتی مثل vi تنظیم شود، تمام کاربران به تمام فایل‌های داخل سیستم دسترسی روت خواهند داشت و یک مشکل امنیتی بزرگ به وجود می‌آید.

2. sgid
 اگر بر روی یک فایل با قابلیت اجرایی تنظیم شود وقتی آن فایل اجرا شود، با دسترسی گروه فایل اجرا می‌شود و نه با دسترسی گروه فردی که فایل را اجرا می‌کند. اگر بر روی دایرکتوری ها تنظیم شود هر فایل یا دایرکتوری که داخل اون فایل ساخته شود، گروه همان فایل را به خود اختصاص می‌دهد و گروه فردی که فایل را ساخته، نمی‌گیرد.

3. sticky
فقط بر روی دایرکتوری ها قابل تنظیم کردن است. اگر بر روی یک دایرکتوری تنظیم شود، فایل‌های داخل دایرکتوری را فقط صاحب دایرکتوری و صاحب فایل و کاربر روت می‌تواند تغییر اسم دهند و یا پاک کنند. این اجازه‌نامه به طور پیش فرض بر روی tmp/ وجود دارد. روی بعضی از سیستم‌های قدیمی این اجازه‌نامه را می‌شود روی فایل‌های معمولی هم تنظیم کرد.

برای تنظیم کردن suid ، sgid و sticky bit از جدول زیر استفاده می‌کنیم:

نوع دسترسی عدد اختصاص داده شده
suid 4000
sgid 2000
sticky bit 1000

اگر suid تنظیم شود، در قسمت صاحب (۳ کاراکتر اول از رشته ۹ کاراکتری)، به جای کاراکتر s ، x قرار می‌گیرد.

chmod 4777 suid
ls -l suid
-rwsrwxrwx 1 alieblice alieblice 7 2013-01-29 12:50 suid

اگر sgid تنظیم شود، در قسمت گروه (۳ کاراکتر دوم از رشته ۹ کاراکتری)، به جای s ، x قرار می‌گیرد.

chmod 2777 sgid
ls -l sgid
-rwxrwsrwx 1 alieblice alieblice 4 2013-01-29 12:55 sgid

اگر stiky تنظیم شود، در قسمت دیگران (۳ کاراکتر سوم از رشته ۹ کاراکتری)، به جای t ، x قرار می‌گیرد.

chmod 1777 test-directory
ls -l test-directory
drwxrwxrwt 2 alieblice alieblice   4096 2013-01-29 12:58 test-directory