دستور chmod (مخفف change mode) یکی از پرکاربردترین دستورات در سیستمعامل لینوکس و سایر سیستمعاملهای شبهیونیکس است که برای تغییر مجوزهای دسترسی (permissions) فایلها و دایرکتوریها به کار میرود. این دستور به شما اجازه میدهد تا بهطور دقیق مشخص کنید که مالک، گروه و سایر کاربران چه سطحی از دسترسی به یک منبع دارند.
سینتکس کلی این دستور به شکل زیر است:
chmod [OPTION]... MODE FILE...
بخش MODE همان تغییری است که میخواهید روی مجوزها اعمال کنید و این بخش را میتوان به دو روش متفاوت نوشت: روش سمبلیک و روش عددی (Octal).
روش سمبلیک (Symbolic Mode)
در روش سمبلیک، از ترکیب حروف و عملگرها استفاده میشود تا بهصورت شهودی مشخص کنیم کدام مجوز برای کدام دسته از کاربران اضافه، حذف یا تنظیم شود.
ساختار کلی
[ugoa...][[+-=][perms...]...]
-
مخاطبان (Who): تعیین میکند تغییرات روی کدام دسته از کاربران اعمال شود.
| حرف | مخاطب |
|---|---|
u | مالک فایل (user) |
g | گروه فایل (group) |
o | سایر کاربران (others) |
a | همه کاربران (مالک، گروه و سایرین) - معادل ugo |
-
عملگرها (Operator): نحوهٔ اعمال تغییرات را مشخص میکنند.
| عملگر | توضیح |
|---|---|
+ | مجوز مشخصشده را به مجوزهای فعلی اضافه میکند. |
- | مجوز مشخصشده را از مجوزهای فعلی حذف میکند. |
= | مجوزها را دقیقاً برابر با مقداری که مشخص میشود تنظیم میکند (مجوزهای ذکرنشده حذف میشوند). |
-
مجوزها (Permissions): همان
r،wوxکه پیشتر معرفی شدند.
مثالهای کاربردی
# اضافه کردن مجوز اجرا برای مالک فایل chmod u+x script.sh # حذف مجوز نوشتن از گروه chmod g-w report.txt # تنظیم مجوز خواندن برای سایرین (و حذف هر مجوز دیگری که داشتند) chmod o=r public.txt # ترکیب چند تغییر با کاما chmod u+rwx,g+rx,o-rwx project_folder # اعمال همزمان روی مالک و گروه chmod ug+rw data.txt # استفاده از 'a' بهجای نوشتن ugo chmod a-x binary_file # حذف مجوز اجرا از همه chmod a=r document.txt # تنظیم مجوز خواندن برای همه و حذف سایر مجوزها
نکته حرفهای: اگر از عملگر
=استفاده کنید، همهٔ مجوزهای قبلی در آن دسته بازنویسی میشوند. مثلاًchmod u=rw fileیعنی مالک فقط مجوز خواندن و نوشتن داشته باشد و اگر قبلاً مجوز اجرا داشته، حذف میشود.
روش عددی / هشتتایی (Numeric / Octal Mode)
در این روش، بهجای حروف، از اعداد برای تعیین مجوزها استفاده میشود. این روش معمولاً سریعتر و دقیقتر است و در اسکریپتنویسی بسیار رایج است.
منطق اعداد
به هر یک از مجوزهای پایه یک وزن عددی اختصاص داده شده است:
| مجوز | مقدار عددی |
|---|---|
r (خواندن) | 4 |
w (نوشتن) | 2 |
x (اجرا) | 1 |
برای بهدست آوردن مجوز نهایی برای هر دسته از کاربران، اعداد مجوزهای موردنظر را با هم جمع میکنیم.
| ترکیب مجوزها | محاسبه | مقدار عددی |
|---|---|---|
--- | 0 | 0 |
--x | 1 | 1 |
-w- | 2 | 2 |
-wx | 2+1 | 3 |
r-- | 4 | 4 |
r-x | 4+1 | 5 |
rw- | 4+2 | 6 |
rwx | 4+2+1 | 7 |
ساختار عدد سهرقمی
یک عدد سهرقمی مانند 754 به ترتیب زیر تفسیر میشود:
-
رقم اول (۷): مجوزهای مالک (User)
-
رقم دوم (۵): مجوزهای گروه (Group)
-
رقم سوم (۴): مجوزهای سایرین (Others)
بنابراین 754 یعنی rwxr-xr-- (مالک همه دسترسیها، گروه خواندن و اجرا، سایرین فقط خواندن).
مثالهای کاربردی
# تنظیم مجوز 755 (rwxr-xr-x) برای اسکریپت chmod 755 app.py # تنظیم مجوز 600 (rw-------) برای فایل تنظیمات حساس chmod 600 ~/.ssh/id_rsa # تنظیم مجوز 644 (rw-r--r--) برای یک فایل متنی معمولی chmod 644 index.html # تنظیم مجوز 700 (rwx------) برای یک دایرکتوری خصوصی chmod 700 ~/private/
تغییرات بازگشتی (Recursive Permissions)
گاهی نیاز داریم مجوزها را نه فقط روی خود دایرکتوری، بلکه روی تمام فایلها و زیردایرکتوریهای داخل آن نیز اعمال کنیم. برای این کار از گزینهٔ -R یا --recursive استفاده میشود.
chmod -R 755 /var/www/myapp/
این دستور، مجوز 755 را به خود دایرکتوری myapp و تمام محتویات درون آن (فایلها و زیردایرکتوریها) اعمال میکند.
روش سمبلیک نیز با گزینهٔ -R کاملاً کار میکند:
# افزودن مجوز نوشتن برای گروه به تمام محتویات پروژه chmod -R g+w /home/project/ # حذف مجوز اجرا از تمام فایلهای یک دایرکتوری (توجه: این کار روی خود دایرکتوریها هم اثر میگذارد) chmod -R a-x /some/path/
هشدار مهم: تغییرات بازگشتی بسیار قدرتمند و در عین حال پرخطر هستند. اگر بهاشتباه مجوز اجرا را از یک دایرکتوری بگیرید (
chmod -R a-x /path)، دیگر نمیتوانید باcdوارد آن شوید و ممکن است کل ساختار آن دایرکتوری برای شما غیرقابلدسترس شود. همیشه پیش از اجرا، مسیر و گزینهها را دوباره بررسی کنید.
تفکیک مجوز فایل و دایرکتوری در حالت بازگشتی
یکی از چالشهای رایج این است که معمولاً میخواهیم مجوز فایلها (644) با مجوز دایرکتوریها (755) متفاوت باشد. دستور chmod -R بهتنهایی نمیتواند این تفکیک را انجام دهد. برای این کار باید از ترکیب find و chmod استفاده کرد:
# تنظیم 644 برای همه فایلها find /path/to/dir -type f -exec chmod 644 {} \; # تنظیم 755 برای همه دایرکتوریها find /path/to/dir -type d -exec chmod 755 {} \;
نکته حرفهای: در توزیعهای جدیدتر لینوکس که از ابزار
treeپشتیبانی میکنند، میتوان از گزینههای-Xو--referenceنیز استفاده کرد، اما روشfindهمچنان استانداردترین و قابلاطمینانترین روش برای تفکیک مجوزهاست.
تغییر مالکیت همزمان با مجوز
اگرچه chmod فقط مجوزها را تغییر میدهد، اما اغلب در کنار دستورات chown (تغییر مالک) و chgrp (تغییر گروه) استفاده میشود تا دسترسیها بهطور کامل مدیریت شوند:
# تغییر مالک به کاربر 'www-data' و تنظیم مجوزهای امن sudo chown -R www-data:www-data /var/www/html/ chmod -R 755 /var/www/html/
اشتباهات رایج و نکات کلیدی
-
اجرا روی دایرکتوری: برای ورود به یک دایرکتوری (
cd)، مجوز اجرا (x) روی آن دایرکتوری ضروری است. مجوز خواندن (r) بدون مجوز اجرا، فقط به شما اجازه میدهد لیست فایلها را ببینید اما نمیتوانید وارد شوید. -
لینکهای سمبلیک: دستور
chmodروی خود لینک سمبلیک اعمال نمیشود و همیشه مجوزهای فایل مقصد را تغییر میدهد. -
اجرای دستور بر روی فایلهای سیستمی: تغییر مجوز فایلهای حیاتی سیستم (مانند
/etc/passwdیا/bin/bash) میتواند سیستم را از کار بیندازد. این کارها معمولاً نیاز به دسترسیroot(باsudo) دارند. -
تأثیر
umask: مجوزهای پیشفرض فایلهای جدید توسطumaskکنترل میشود و ربطی بهchmodندارد، اما درک آن برای جلوگیری از سورپرایزهای امنیتی ضروری است. -
استفاده از
-Rبا روش عددی: همیشه به یاد داشته باشید کهchmod -R 777یعنی به همه چیز دسترسی کامل بدهید — این کار بهشدت ناامن است و هرگز نباید روی دایرکتوریهای عمومی انجام شود.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات