دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • CloudLinux
    • Cloudflare
  • تماس با ما
دانشنامه مارال هاست دانشنامه مارال هاست
دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • CloudLinux
    • Cloudflare
  • تماس با ما
لینوکس
  • Folder icon closed Folder open iconآشنایی با لینوکس (Linux Fundamentals)
  • Folder icon closed Folder open iconتوزیع‌های مختلف لینوکس (Linux Distributions)
  • Folder icon closed Folder open iconFHS؛ آشنایی با ساختار فایل‌ و پوشه‌های لینوکسی
  • Folder icon closed Folder open iconمهم‌ترین دستورات پایه‌ای برای هر sysadmin
  • Folder icon closed Folder open iconمدیریت فایل و پوشه (file & directory management) در لینوکس
  • Folder icon closed Folder open iconآموزش ویرایش فایل‌های متنی در لینوکس با Nano و Vim
  • Folder icon closed Folder open iconآشنایی با users، groups و ساختار مدیریت کاربران در لینوکس
  • Folder icon closed Folder open iconآموزش Permission و Ownership در لینوکس
  • Folder icon closed Folder open iconآشنایی با Root و sudo
  • Folder icon closed Folder open iconآشنایی با Processها در لینوکس
  • Folder icon closed Folder open iconتغییر Hostname در لینوکس
  • Folder icon closed Folder open iconتنظیم Timezone در لینوکس
  • Folder icon closed Folder open iconتنظیم NTP در لینوکس
  • Folder icon closed Folder open iconبروزرسانی سیستم در لینوکس
  • Folder icon closed Folder open iconساخت کاربر جدید در لینوکس
  • Folder icon closed Folder open iconایجاد کاربران و گروه ها در لینوکس
  • Folder icon closed Folder open iconآموزش ACL در لینوکس؛ مدیریت سطح دسترسی پیشرفته برای کاربران و گروه‌ها
  • Folder icon closed Folder open iconآموزش umask در لینوکس؛ تعیین مجوز پیش‌فرض فایل‌ها و پوشه‌های جدید
  • Folder icon closed Folder open iconآموزش فایل sudoers؛ مدیریت دسترسی کاربران به دستورات مدیریتی در لینوکس
  • Folder icon closed Folder open iconآموزش دستور chown در لینوکس
  • Folder icon closed Folder open iconآموزش دستور chmod در لینوکس
  • Folder icon closed Folder open iconSticky Bit در لینوکس چیست؟ آموزش افزایش امنیت پوشه‌های اشتراکی
  • Folder icon closed Folder open iconآموزش SUID در لینوکس؛ اجرای برنامه‌ها با دسترسی مالک فایل
  • Folder icon closed Folder open iconآموزش SGID در لینوکس؛ مدیریت دسترسی گروه‌ها و اجرای برنامه‌ها
لینوکس

آموزش دستور chmod در لینوکس

آموزش دستور chmod در لینوکس

مقدمه

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

برای مثال، ممکن است یک کاربر اجازه مشاهده یک فایل را داشته باشد، اما نتواند آن را ویرایش کند. همچنین ممکن است اعضای یک گروه بتوانند وارد یک پوشه شوند، اما اجازه ایجاد یا حذف فایل داخل آن را نداشته باشند.

دستور chmod یکی از مهم‌ترین دستورهای مدیریت Permission در لینوکس است و برای تغییر مجوز فایل‌ها و پوشه‌های موجود استفاده می‌شود.

استفاده نادرست از این دستور، مخصوصاً همراه با گزینه -R یا مجوزهایی مانند 777، می‌تواند باعث افشای اطلاعات، تغییر غیرمجاز فایل‌ها، اختلال در اجرای برنامه‌ها یا ایجاد آسیب‌پذیری امنیتی شود.

در این مقاله موارد زیر را بررسی می‌کنیم:

  • مفهوم Permission در لینوکس
  • مجوزهای Read، Write و Execute
  • تفاوت مجوز فایل و پوشه
  • روش عددی و نمادین chmod
  • تغییر بازگشتی مجوزها
  • استفاده از X
  • مجوزهای SetUID، SetGID و Sticky Bit
  • ارتباط chmod با ACL و umask
  • تنظیم مجوز فایل‌های وب‌سایت
  • رفع خطاهای رایج

دستور chmod چیست؟

دستور chmod مخفف Change Mode است و برای تغییر Permission فایل‌ها و پوشه‌ها استفاده می‌شود.

ساختار کلی دستور:

chmod [OPTIONS] MODE FILE

نمونه:

chmod 640 report.txt

یا با ساختار نمادین:

chmod u=rw,g=r,o= report.txt

هر دو دستور مجوز زیر را تنظیم می‌کنند:

Owner: Read and Write
Group: Read Only
Other users: No Access

مشاهده مجوز فایل‌ها و پوشه‌ها

برای مشاهده Permission فایل از دستور زیر استفاده کنید:

ls -l report.txt

نمونه خروجی:

-rw-r----- 1 ali developers 2048 Jul 25 10:30 report.txt

قسمت اول خروجی Permission فایل را نشان می‌دهد:

-rw-r-----

این بخش را می‌توان به چهار قسمت تقسیم کرد:

-   rw-   r--   ---
│    │     │     │
│    │     │     └── Other users
│    │     └──────── Group
│    └────────────── Owner
└─────────────────── File type

مشاهده مجوز پوشه

برای مشاهده مجوز خود پوشه:

ls -ld /srv/project

نمونه خروجی:

drwxr-x--- 5 ali developers 4096 Jul 25 10:30 /srv/project

حرف اول d نشان می‌دهد مسیر یک Directory است:

d = Directory

اگر حرف اول - باشد، مسیر یک فایل معمولی است:

- = Regular file

مشاهده مجوز عددی با stat

stat -c '%a %A %U %G %n' report.txt

نمونه خروجی:

640 -rw-r----- ali developers report.txt

ترتیب خروجی:

Numeric mode
Symbolic mode
Owner
Group
File name

برای پوشه:

stat -c '%a %A %U %G %n' /srv/project

نمونه خروجی:

750 drwxr-x--- ali developers /srv/project

کاربران مشمول Permission

مجوزهای لینوکس برای سه دسته تعریف می‌شوند:

u = User owner
g = Group owner
o = Other users
a = All users

مالک فایل

حرف u مربوط به مالک اصلی فایل است:

u = User owner

گروه مالک

حرف g مربوط به گروه مالک فایل است:

g = Group owner

سایر کاربران

حرف o مربوط به کاربرانی است که مالک فایل نیستند و از Permission گروه مالک نیز استفاده نمی‌کنند:

o = Other users

همه کاربران

حرف a تمام دسته‌ها را شامل می‌شود:

a = User, Group, and Other

انواع مجوز در لینوکس

سه مجوز اصلی عبارت‌اند از:

r = Read
w = Write
x = Execute

هرکدام از این مجوزها روی فایل و پوشه معنای متفاوتی دارند.


مفهوم مجوزها روی فایل

مجوز Read

مجوز r روی فایل به کاربر اجازه مشاهده محتوای فایل را می‌دهد.

r = Read file contents

مثال:

cat report.txt

اگر کاربر Permission خواندن نداشته باشد:

cat: report.txt: Permission denied

مجوز Write

مجوز w روی فایل اجازه تغییر محتوای آن را می‌دهد:

w = Modify file contents

مثال:

echo "New data" >> report.txt

داشتن Permission نوشتن روی خود فایل الزاماً به‌معنای امکان حذف فایل نیست. حذف فایل بیشتر به Permission پوشه والد بستگی دارد.


مجوز Execute

مجوز x روی فایل اجازه اجرای آن به‌عنوان برنامه یا Script را می‌دهد:

x = Execute the file

برای مثال:

./backup.sh

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

bash: ./backup.sh: Permission denied

برای افزودن مجوز اجرا:

chmod +x backup.sh

مفهوم مجوزها روی پوشه

معنای r، w و x روی پوشه با فایل متفاوت است.

مجوز Read روی پوشه

مجوز r اجازه مشاهده نام فایل‌های داخل پوشه را می‌دهد:

r = List directory contents

مثال:

ls /srv/project

مجوز Write روی پوشه

مجوز w همراه با x اجازه انجام عملیات زیر را می‌دهد:

Create files
Delete files
Rename files
Create subdirectories

داشتن w بدون x معمولاً دسترسی عملی کافی ایجاد نمی‌کند.


مجوز Execute روی پوشه

مجوز x به کاربر اجازه ورود و عبور از پوشه را می‌دهد:

x = Enter or traverse the directory

مثال:

cd /srv/project

همچنین کاربر برای دسترسی به فایل‌های داخل یک مسیر باید روی تمام پوشه‌های والد، مجوز x داشته باشد.


نمونه ترکیب Permission پوشه

r-- = List names but cannot access entries normally
--x = Access known entries without listing all names
r-x = List and access directory entries
-wx = Create, delete, or rename entries without normal listing
rwx = Full directory access

روش عددی chmod

در روش عددی، هر Permission یک مقدار مشخص دارد:

مجوزمقدار
Read4
Write2
Execute1
No Permission0

برای ساخت Permission نهایی، مقادیر با یکدیگر جمع می‌شوند.


جدول مجوزهای عددی

مقدارPermissionمعنی
0---بدون دسترسی
1--xفقط اجرا
2-w-فقط نوشتن
3-wxنوشتن و اجرا
4r--فقط خواندن
5r-xخواندن و اجرا
6rw-خواندن و نوشتن
7rwxدسترسی کامل

ساختار مجوز سه‌رقمی

در Permission سه‌رقمی، اعداد به‌ترتیب مربوط به دسته‌های زیر هستند:

Owner
Group
Other

برای مثال:

640

تجزیه:

6 = Owner: Read and Write
4 = Group: Read Only
0 = Other users: No Access

تنظیم مجوز 644

chmod 644 report.txt

نتیجه:

Owner: Read and Write
Group: Read Only
Other users: Read Only

نمایش نمادین:

-rw-r--r--

این مجوز برای بسیاری از فایل‌های عمومی و فایل‌های وب‌سایت استفاده می‌شود.


تنظیم مجوز 640

chmod 640 report.txt

نتیجه:

Owner: Read and Write
Group: Read Only
Other users: No Access

نمایش:

-rw-r-----

این Permission برای فایل‌های محدودتر مناسب است.


تنظیم مجوز 600

chmod 600 private-key

نتیجه:

Owner: Read and Write
Group: No Access
Other users: No Access

نمایش:

-rw-------

این مجوز برای فایل‌هایی مانند موارد زیر کاربرد دارد:

SSH private keys
Password files
API credentials
Private configuration files
Backup credentials

تنظیم مجوز 755

chmod 755 script.sh

نتیجه:

Owner: Read, Write, and Execute
Group: Read and Execute
Other users: Read and Execute

نمایش:

-rwxr-xr-x

این مجوز برای Scriptها و برنامه‌هایی که باید توسط دیگران اجرا شوند رایج است.


تنظیم مجوز 750

chmod 750 script.sh

نتیجه:

Owner: Read, Write, and Execute
Group: Read and Execute
Other users: No Access

این مقدار برای Scriptهای مدیریتی محدود مناسب‌تر است.


تنظیم مجوز پوشه 755

chmod 755 /srv/project

نتیجه:

Owner: Full directory access
Group: List and enter
Other users: List and enter

نمایش:

drwxr-xr-x

تنظیم مجوز پوشه 750

chmod 750 /srv/project

نتیجه:

Owner: Full directory access
Group: List and enter
Other users: No Access

نمایش:

drwxr-x---

تنظیم مجوز پوشه 700

chmod 700 /home/ali/private

نتیجه:

Owner: Full directory access
Group: No Access
Other users: No Access

این Permission برای پوشه‌های خصوصی مناسب است.


چرا استفاده از 777 خطرناک است؟

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

chmod 777 file

نتیجه:

Owner: Read, Write, and Execute
Group: Read, Write, and Execute
Other users: Read, Write, and Execute

مشکلات امنیتی احتمالی:

Unauthorized file modification
Malicious code injection
File deletion
Configuration manipulation
Website defacement
Privilege escalation paths

در اغلب موارد استفاده از 777 راه‌حل مناسبی برای خطای Permission نیست.

به‌جای آن باید موارد زیر بررسی شوند:

  • مالک و گروه فایل
  • کاربر واقعی سرویس
  • Permission پوشه‌های والد
  • ACL
  • SELinux یا AppArmor
  • Read-only بودن فایل‌سیستم

روش نمادین chmod

در روش نمادین از حروف زیر استفاده می‌شود:

u = Owner
g = Group
o = Other users
a = All users

عملگرهای اصلی:

+ = Add permission
- = Remove permission
= = Set exact permission

Permissionها:

r = Read
w = Write
x = Execute

افزودن مجوز اجرا

برای افزودن Execute به مالک:

chmod u+x script.sh

برای افزودن Execute به همه کاربران:

chmod a+x script.sh

یا:

chmod +x script.sh

بررسی:

ls -l script.sh

نمونه خروجی:

-rwxr-xr-x 1 ali developers 512 Jul 25 10:30 script.sh

حذف مجوز نوشتن

حذف Write از گروه:

chmod g-w report.txt

حذف Write از سایر کاربران:

chmod o-w report.txt

حذف Write از گروه و سایر کاربران:

chmod go-w report.txt

تنظیم دقیق Permission

دستور زیر Permission مالک، گروه و سایر کاربران را دقیقاً تعیین می‌کند:

chmod u=rw,g=r,o= report.txt

نتیجه:

Owner: Read and Write
Group: Read Only
Other users: No Access

معادل عددی:

chmod 640 report.txt

اعمال چند تغییر در یک دستور

chmod u+rw,g+r,o-rwx report.txt

تغییرات:

Owner: Add Read and Write
Group: Add Read
Other users: Remove all permissions

کپی Permission بین دسته‌ها

می‌توان Permission یک دسته را برای دسته دیگری کپی کرد.

کپی Permission مالک برای گروه:

chmod g=u report.txt

کپی Permission گروه برای سایر کاربران:

chmod o=g report.txt

کپی Permission مالک برای گروه و سایر کاربران:

chmod go=u report.txt

قبل از این عملیات Permission فعلی را بررسی کنید.


تغییر Permission چند فایل

chmod 640 file1.txt file2.txt file3.txt

بررسی:

stat -c '%a %n' file1.txt file2.txt file3.txt

نمونه خروجی:

640 file1.txt
640 file2.txt
640 file3.txt

استفاده از Wildcard

برای تغییر تمام فایل‌های متنی:

chmod 640 *.txt

قبل از اجرا، فایل‌های منطبق را مشاهده کنید:

printf '%s\n' *.txt

Wildcard فایل‌های مخفی را به‌صورت عادی شامل نمی‌شود.

برای فایل‌های مخفی باید جداگانه بررسی شود.


تغییر مجوز یک پوشه

chmod 750 /srv/project

این دستور فقط Permission خود پوشه را تغییر می‌دهد و فایل‌های داخل آن بدون تغییر باقی می‌مانند.


تغییر بازگشتی Permission

برای تغییر Permission پوشه و تمام محتوای آن:

chmod -R 750 /srv/project

گزینه -R مخفف Recursive است.

این دستور مجوز 750 را روی موارد زیر اعمال می‌کند:

Target directory
Subdirectories
Regular files
Scripts
Configuration files
Images
Documents

این رفتار معمولاً مناسب نیست؛ زیرا فایل و پوشه به Permission متفاوتی نیاز دارند.


مشکل chmod -R با یک Permission ثابت

دستور زیر:

chmod -R 755 /var/www/example.com

تمام فایل‌ها را نیز Executable می‌کند:

PHP files: Executable
HTML files: Executable
Images: Executable
Configuration files: Executable

در بیشتر موارد فایل‌های معمولی نباید Execute باشند.

روش مناسب، تنظیم جداگانه فایل‌ها و پوشه‌ها است.


تنظیم جداگانه فایل‌ها و پوشه‌ها

برای پوشه‌ها:

find /var/www/example.com -type d -exec chmod 755 {} +

برای فایل‌ها:

find /var/www/example.com -type f -exec chmod 644 {} +

نتیجه:

Directories: 755
Files: 644

برای ساختار محدودتر:

find /srv/project -type d -exec chmod 750 {} +
find /srv/project -type f -exec chmod 640 {} +

پیش‌نمایش قبل از تغییر

قبل از اجرای chmod، فایل‌های هدف را نمایش دهید:

find /srv/project -type f -print

پوشه‌ها:

find /srv/project -type d -print

پس از تأیید از -exec chmod استفاده کنید.


استفاده از حرف X بزرگ

حرف X فقط در شرایط زیر Execute را اضافه می‌کند:

  • مسیر یک Directory باشد.
  • فایل از قبل برای حداقل یکی از دسته‌ها Execute باشد.

مثال:

chmod -R a+rX /srv/project

این دستور:

Adds Read to all users
Adds Execute to directories
Preserves executable status for existing executable files
Does not make normal files executable

این روش برای اعمال Permission بازگشتی از a+rx ایمن‌تر است.


نمونه کاربرد X

ابتدا:

find /srv/project -maxdepth 2 -printf '%M %p\n'

سپس:

chmod -R u=rwX,g=rX,o= /srv/project

نتیجه معمول:

Directories: Owner rwx, Group r-x, Other none
Regular files: Owner rw-, Group r--, Other none
Existing executable files: Execute preserved as allowed

جلوگیری از تغییر مسیر ریشه

در نسخه‌های GNU Coreutils می‌توان هنگام استفاده بازگشتی از گزینه زیر استفاده کرد:

chmod --preserve-root -R 750 /srv/project

این گزینه از اجرای Recursive روی مسیر / جلوگیری می‌کند.

دستور بسیار خطرناک:

sudo chmod -R 777 /

این دستور می‌تواند امنیت و عملکرد کل سیستم را مختل کند.

قبل از عملیات بازگشتی مسیر را بررسی کنید:

realpath /srv/project

نمایش تغییرات

برای نمایش تمام فایل‌های پردازش‌شده:

chmod -Rv 750 /srv/project

نمونه خروجی:

mode of '/srv/project' retained as 0750
mode of '/srv/project/config' changed from 0755 to 0750
mode of '/srv/project/config/app.conf' changed from 0644 to 0750

گزینه -v تمام موارد را نمایش می‌دهد.


نمایش فقط تغییرات واقعی

chmod -Rc 750 /srv/project

نمونه خروجی:

mode of '/srv/project/config' changed from 0755 to 0750

گزینه -c فقط مواردی را نمایش می‌دهد که واقعاً تغییر کرده‌اند.


کپی Permission از فایل مرجع

برای تنظیم Permission یک فایل براساس فایل دیگر:

chmod --reference=source.txt destination.txt

بررسی:

stat -c '%a %n' source.txt destination.txt

نمونه خروجی:

640 source.txt
640 destination.txt

این روش در Scriptها و Deploymentها مفید است.


مجوزهای چهاررقمی

Permission ممکن است به‌صورت چهاررقمی نیز نوشته شود:

4755
2755
1777

رقم اول مربوط به Special Permissionها است:

مقدارSpecial Permission
4SetUID
2SetGID
1Sticky Bit

این مقادیر نیز می‌توانند با یکدیگر ترکیب شوند.


SetUID چیست؟

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

تنظیم عددی:

chmod 4755 application

تنظیم نمادین:

chmod u+s application

نمایش:

ls -l application

نمونه خروجی:

-rwsr-xr-x 1 root root 4096 Jul 25 10:30 application

حرف s در بخش Owner Execute نشان‌دهنده SetUID است.

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


حذف SetUID

chmod u-s application

یا:

chmod 0755 application

بررسی:

ls -l application

SetGID روی فایل

SetGID روی فایل اجرایی باعث می‌شود برنامه با گروه مالک فایل اجرا شود.

تنظیم:

chmod g+s application

یا:

chmod 2755 application

نمایش:

-rwxr-sr-x

SetGID روی پوشه

SetGID روی پوشه کاربرد مهم‌تری دارد. فایل‌ها و پوشه‌های جدید داخل آن، گروه پوشه والد را به ارث می‌برند.

مثال:

sudo chown root:developers /srv/developers
sudo chmod 2770 /srv/developers

بررسی:

ls -ld /srv/developers

خروجی:

drwxrws--- 2 root developers 4096 Jul 25 10:30 /srv/developers

حرف s در بخش Group Execute نشان‌دهنده SetGID است.

این قابلیت برای پوشه‌های اشتراکی تیمی مفید است.


حذف SetGID

chmod g-s /srv/developers

یا:

chmod 0770 /srv/developers

Sticky Bit چیست؟

Sticky Bit معمولاً روی پوشه‌های اشتراکی استفاده می‌شود.

در یک پوشه دارای Sticky Bit، کاربران می‌توانند فایل ایجاد کنند، اما فقط موارد زیر می‌توانند فایل را حذف یا تغییر نام دهند:

File owner
Directory owner
root

مثال معروف:

/tmp

بررسی:

ls -ld /tmp

نمونه خروجی:

drwxrwxrwt 12 root root 4096 Jul 25 10:30 /tmp

حرف t نشان‌دهنده Sticky Bit است.


فعال‌کردن Sticky Bit

chmod +t /srv/shared

یا:

chmod 1777 /srv/shared

بررسی:

ls -ld /srv/shared

خروجی:

drwxrwxrwt 2 root root 4096 Jul 25 10:30 /srv/shared

حذف Sticky Bit

chmod -t /srv/shared

یا:

chmod 0777 /srv/shared

تفاوت s و S

اگر SetUID یا SetGID فعال باشد و Execute نیز وجود داشته باشد، حرف کوچک s نمایش داده می‌شود:

-rwsr-xr-x

اگر SetUID فعال باشد اما Execute مالک وجود نداشته باشد، حرف بزرگ S نمایش داده می‌شود:

-rwSr--r--

حرف بزرگ S معمولاً نشان‌دهنده تنظیم ناسازگار یا غیرکاربردی است.

برای اصلاح:

chmod u+x application

یا SetUID را حذف کنید:

chmod u-s application

تفاوت t و T

اگر Sticky Bit و Execute بخش Other هر دو فعال باشند:

drwxrwxrwt

حرف کوچک t نمایش داده می‌شود.

اگر Sticky Bit فعال باشد اما Execute برای Other وجود نداشته باشد:

drwxrwxrwT

حرف بزرگ T نمایش داده می‌شود.


پیدا کردن فایل‌های SetUID

sudo find / -xdev -type f -perm -4000 -ls 2>/dev/null

پیدا کردن فایل‌های SetGID:

sudo find / -xdev -type f -perm -2000 -ls 2>/dev/null

پیدا کردن پوشه‌های Sticky Bit:

sudo find / -xdev -type d -perm -1000 -ls 2>/dev/null

این موارد باید به‌صورت دوره‌ای بررسی شوند.


استفاده از chmod با find و -perm

پیدا کردن فایل‌های دارای Permission دقیق 777:

find /srv/project -type f -perm 0777 -ls

پیدا کردن مسیرهایی که برای Other قابل‌نوشتن هستند:

find /srv/project -perm -0002 -ls

پیدا کردن فایل‌های Executable:

find /srv/project -type f -perm /111 -ls

پیدا کردن پوشه‌های بدون Execute برای مالک:

find /srv/project -type d ! -perm -0100 -ls

حذف دسترسی Write از Other

روی یک فایل:

chmod o-w report.txt

روی تمام فایل‌ها و پوشه‌های مسیر:

chmod -R o-w /srv/project

روش کنترل‌شده‌تر:

find /srv/project -perm -0002 -print

سپس:

find /srv/project -perm -0002 -exec chmod o-w {} +

اصلاح مجوز فایل‌های خصوصی

برای فایل خصوصی:

chmod 600 credentials.conf

برای پوشه خصوصی:

chmod 700 /home/ali/private

برای SSH Private Key:

chmod 600 ~/.ssh/id_ed25519

برای پوشه SSH:

chmod 700 ~/.ssh

برای فایل کلیدهای مجاز:

chmod 600 ~/.ssh/authorized_keys

بررسی:

stat -c '%a %n' \
~/.ssh \
~/.ssh/id_ed25519 \
~/.ssh/authorized_keys

نمونه خروجی:

700 /home/ali/.ssh
600 /home/ali/.ssh/id_ed25519
600 /home/ali/.ssh/authorized_keys

مثال عملی Script اجرایی

فایل Script ایجاد کنید:

nano backup.sh

محتوا:

#!/bin/bash

echo "Backup started"

ابتدا Permission را بررسی کنید:

ls -l backup.sh

نمونه:

-rw-r--r-- 1 ali ali 43 Jul 25 10:30 backup.sh

مجوز اجرا اضافه کنید:

chmod u+x backup.sh

اجرا:

./backup.sh

خروجی:

Backup started

مثال عملی فایل‌های وب‌سایت

در یک ساختار عمومی، Permissionهای رایج می‌توانند به‌شکل زیر باشند:

Directories: 755
Files: 644

اعمال روی پوشه‌ها:

find /var/www/example.com -type d -exec chmod 755 {} +

اعمال روی فایل‌ها:

find /var/www/example.com -type f -exec chmod 644 {} +

برای ساختار محدودتر:

Directories: 750
Files: 640

دستورها:

find /var/www/example.com -type d -exec chmod 750 {} +
find /var/www/example.com -type f -exec chmod 640 {} +

انتخاب Permission به مالک، گروه، کاربر PHP-FPM و معماری سرور بستگی دارد.


فایل‌های حساس وب‌سایت

برای فایل تنظیمات حساس:

chmod 640 /var/www/example.com/config.php

یا در شرایط خصوصی‌تر:

chmod 600 /var/www/example.com/config.php

اما باید مطمئن شوید سرویس وب یا PHP همچنان امکان خواندن فایل را دارد.


پوشه‌های قابل‌نوشتن برنامه

برخی برنامه‌ها به پوشه‌هایی مانند موارد زیر نیاز دارند:

uploads
cache
storage
sessions
logs

دادن Permission 777 توصیه نمی‌شود.

روش مناسب‌تر:

sudo chown -R siteuser:www-data /var/www/example.com/storage
sudo chmod -R u=rwX,g=rwX,o= /var/www/example.com/storage

یا با SetGID:

sudo chmod 2770 /var/www/example.com/storage

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


مثال عملی پوشه اشتراکی گروه

ایجاد گروه:

sudo groupadd developers

افزودن کاربران:

sudo usermod -aG developers ali
sudo usermod -aG developers reza

ایجاد پوشه:

sudo mkdir -p /srv/developers

تنظیم مالکیت:

sudo chown root:developers /srv/developers

تنظیم Permission همراه SetGID:

sudo chmod 2770 /srv/developers

نتیجه:

Owner: Full access
Group: Full access
Other users: No access
New entries inherit the developers group

برای مدیریت فایل‌های جدید می‌توان umask 007 یا Default ACL نیز تنظیم کرد.


ارتباط chmod با umask

دستور chmod مجوز فایل یا پوشه موجود را تغییر می‌دهد.

umask مجوز پیش‌فرض فایل‌ها و پوشه‌های جدید را محدود می‌کند.

مثال:

umask 027
touch report.txt
mkdir project

نتیجه معمول:

New file: 640
New directory: 750

سپس می‌توان Permission را با chmod تغییر داد:

chmod 600 report.txt
chmod 700 project

تغییر umask روی فایل‌های قبلی اثر ندارد.


ارتباط chmod با ACL

ACL می‌تواند مجوزهای اضافی برای کاربران و گروه‌های مشخص تعریف کند.

بررسی ACL:

getfacl report.txt

نمونه خروجی:

# file: report.txt
# owner: ali
# group: developers
user::rw-
user:reza:rw-
group::r--
mask::rw-
other::---

در فایل دارای ACL، بیت‌های Group در خروجی ls -l معمولاً نمایانگر ACL Mask هستند.

اجرای دستور زیر:

chmod g-w report.txt

ممکن است Mask را محدود کند و Permission مؤثر کاربر reza را نیز تغییر دهد.

بررسی:

getfacl -e report.txt

نمونه:

user::rw-
user:reza:rw-                #effective:r--
group::r--
mask::r--
other::---

پس از اجرای chmod روی فایل ACLدار، همیشه getfacl را بررسی کنید.


ارتباط chmod با مالکیت فایل

chmod مالک یا گروه فایل را تغییر نمی‌دهد.

بررسی:

stat -c '%a %U %G %n' report.txt

تغییر Permission:

chmod 640 report.txt

برای تغییر مالکیت باید از chown استفاده شود:

sudo chown ali:developers report.txt

ارتباط chmod با SELinux

chmod فقط Permissionهای Unix را تغییر می‌دهد.

در AlmaLinux، Rocky Linux و RHEL ممکن است SELinux همچنان دسترسی را مسدود کند.

بررسی وضعیت:

getenforce

نمونه خروجی:

Enforcing

بررسی Context:

ls -Z /var/www/example.com

بازیابی Context استاندارد:

sudo restorecon -Rv /var/www/example.com

بررسی خطاهای SELinux:

sudo ausearch -m AVC -ts recent

برای رفع خطای SELinux از chmod 777 استفاده نکنید.


ارتباط chmod با Read-only File System

اگر فایل‌سیستم Read-only باشد، chmod با خطا مواجه می‌شود.

بررسی:

findmnt -T report.txt -o TARGET,FSTYPE,OPTIONS

نمونه:

TARGET FSTYPE OPTIONS
/data  ext4   ro,relatime

وجود ro نشان می‌دهد فایل‌سیستم فقط خواندنی است.


مجوز Symbolic Link

در بیشتر سیستم‌های لینوکسی، Permission خود Symbolic Link قابل استفاده نیست و دسترسی براساس فایل مقصد بررسی می‌شود.

مشاهده:

ls -l current-config

نمونه:

lrwxrwxrwx 1 root root 18 Jul 25 10:30 current-config -> /etc/app/config

اجرای chmod روی Symlink معمولاً Permission فایل مقصد را تغییر می‌دهد:

chmod 640 current-config

برای مشاهده مقصد:

readlink -f current-config

در عملیات بازگشتی، رفتار Symlinkها را با احتیاط بررسی کنید.


مجوز Hard Link

Hard Linkها به یک Inode مشترک اشاره می‌کنند. تغییر Permission یکی از نام‌ها، Permission تمام Hard Linkهای همان Inode را تغییر می‌دهد.

بررسی:

ls -li file1 file2

نمونه:

123456 -rw-r----- 2 ali developers 2048 Jul 25 10:30 file1
123456 -rw-r----- 2 ali developers 2048 Jul 25 10:30 file2

تغییر:

chmod 600 file1

بررسی:

ls -li file1 file2

نتیجه:

123456 -rw------- 2 ali developers 2048 Jul 25 10:30 file1
123456 -rw------- 2 ali developers 2048 Jul 25 10:30 file2

حفظ Permission هنگام کپی

برای حفظ Permission و سایر Attributeها:

cp -a /srv/source/. /srv/destination/

با rsync:

rsync -a /srv/source/ /srv/destination/

برای حفظ ACL و Extended Attribute:

rsync -aAX /srv/source/ /srv/destination/

بررسی:

stat -c '%a %U %G %n' \
/srv/source/file.txt \
/srv/destination/file.txt

تهیه Backup از Permission

می‌توان Permissionها را همراه با ACL با getfacl ذخیره کرد:

sudo getfacl -R -p /srv/project > /root/project-permissions.backup

بازیابی:

sudo setfacl --restore=/root/project-permissions.backup

این روش ACL و Permissionهای پایه را ثبت می‌کند.

برای عملیات گسترده chmod، تهیه Backup از مجوزها توصیه می‌شود.


استفاده از chmod داخل Script

نمونه Script کنترل‌شده:

#!/bin/bash

set -euo pipefail

target="/srv/project"

if [[ -z "$target" || "$target" == "/" ]]; then
    echo "Unsafe target path"
    exit 1
fi

if [[ ! -d "$target" ]]; then
    echo "Target directory does not exist"
    exit 1
fi

/usr/bin/find "$target" \
    -type d \
    -exec /usr/bin/chmod 750 {} +

/usr/bin/find "$target" \
    -type f \
    -exec /usr/bin/chmod 640 {} +

در Scriptهای مدیریتی:

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

ساخت فایل با Permission مشخص

به‌جای ایجاد فایل و سپس اجرای chmod می‌توان از دستور install استفاده کرد:

sudo install \
-o ali \
-g developers \
-m 640 \
/dev/null \
/srv/project/report.txt

بررسی:

stat -c '%a %U %G %n' /srv/project/report.txt

خروجی:

640 ali developers /srv/project/report.txt

ایجاد پوشه:

sudo install \
-d \
-o ali \
-g developers \
-m 750 \
/srv/project/config

رفع خطاهای رایج chmod

خطای Operation not permitted

نمونه:

chmod: changing permissions of 'report.txt': Operation not permitted

دلایل احتمالی:

  • کاربر مالک فایل نیست.
  • کاربر دسترسی root ندارد.
  • فایل‌سیستم Read-only است.
  • فایل Immutable است.
  • فایل روی NFS یا CIFS قرار دارد.
  • Container Capability لازم را ندارد.
  • SELinux یا Policy دیگری محدودیت ایجاد کرده است.

با sudo آزمایش کنید:

sudo chmod 640 report.txt

بررسی مالک فایل

stat -c '%U %G %a %n' report.txt

فقط مالک فایل یا root معمولاً می‌تواند Permission را تغییر دهد.


بررسی Immutable Attribute

lsattr report.txt

نمونه:

----i----------------- report.txt

وجود i نشان‌دهنده Immutable بودن فایل است.

حذف موقت:

sudo chattr -i report.txt

تغییر Permission:

sudo chmod 640 report.txt

فعال‌سازی مجدد در صورت نیاز:

sudo chattr +i report.txt

خطای No such file or directory

نمونه:

chmod: cannot access 'report.txt': No such file or directory

بررسی:

ls -l report.txt

مسیر کامل:

realpath report.txt

در Scriptها از مسیر Absolute استفاده کنید.


Permission صحیح است اما دسترسی وجود ندارد

موارد زیر را بررسی کنید:

  1. مالک و گروه فایل
  2. Permission پوشه‌های والد
  3. عضویت کاربر در گروه
  4. ACL
  5. ACL Mask
  6. SELinux یا AppArmor
  7. Read-only بودن فایل‌سیستم
  8. کاربر واقعی سرویس
  9. NFS یا CIFS
  10. Container User Namespace

بررسی مسیر کامل:

namei -l /srv/project/report.txt

بررسی ACL:

getfacl -e /srv/project/report.txt

بررسی کاربر سرویس:

ps -eo user,group,comm | grep application

فایل Executable است اما اجرا نمی‌شود

Permission را بررسی کنید:

ls -l script.sh

Shebang:

head -n 1 script.sh

نمونه صحیح:

#!/bin/bash

فایل‌سیستم ممکن است با گزینه noexec Mount شده باشد:

findmnt -T script.sh -o TARGET,FSTYPE,OPTIONS

وجود گزینه زیر مانع اجرا می‌شود:

noexec

همچنین SELinux یا AppArmor را بررسی کنید.


پوشه قابل‌خواندن است اما cd کار نمی‌کند

مجوز x روی پوشه لازم است:

chmod u+x /srv/project

برای گروه:

chmod g+x /srv/project

بررسی تمام پوشه‌های والد:

namei -l /srv/project

کاربر فایل را می‌خواند اما نمی‌تواند حذف کند

حذف فایل به Permission پوشه والد بستگی دارد.

بررسی:

ls -ld /srv/project

برای حذف، کاربر معمولاً به w و x روی پوشه والد نیاز دارد.

در پوشه اشتراکی، Sticky Bit نیز ممکن است مانع حذف فایل دیگران شود.


chmod -R باعث Executable شدن همه فایل‌ها شده است

ابتدا فایل‌های معمولی را اصلاح کنید:

find /srv/project -type f -exec chmod 640 {} +

پوشه‌ها:

find /srv/project -type d -exec chmod 750 {} +

سپس Scriptهای واقعی را جداگانه Executable کنید:

find /srv/project/scripts \
-type f \
-name '*.sh' \
-exec chmod 750 {} +

chmod روی فایل ACLدار نتیجه غیرمنتظره دارد

ACL را بررسی کنید:

getfacl -e report.txt

اگر Mask محدود شده است:

sudo setfacl -m m::rw- report.txt

یا ACL اضافه را فقط در صورت نیاز حذف کنید:

sudo setfacl -b report.txt

قبل از حذف ACL از آن Backup تهیه کنید.


chmod 777 مشکل وب‌سایت را حل نکرده است

موارد زیر را بررسی کنید:

Wrong file owner
Wrong group
Parent directory permissions
PHP-FPM user mismatch
SELinux context
Read-only filesystem
Application configuration
ACL restrictions
Container volume mapping

کاربر سرویس:

ps -eo user,group,comm | grep -E 'nginx|apache2|httpd|php-fpm'

SELinux:

getenforce

ACL:

getfacl /var/www/example.com

نکات امنیتی و بهترین روش‌ها

  • قبل از اجرای chmod -R مسیر را بررسی کنید.
  • از chmod 777 برای رفع سریع خطا استفاده نکنید.
  • فایل‌ها و پوشه‌ها را جداگانه مدیریت کنید.
  • برای عملیات بازگشتی از X بزرگ استفاده کنید.
  • روی فایل‌های معمولی بدون نیاز Execute قرار ندهید.
  • Permission فایل‌های حساس را روی 600 یا 640 قرار دهید.
  • Permission پوشه‌های خصوصی را روی 700 یا 750 قرار دهید.
  • برای پوشه‌های اشتراکی از SetGID و گروه مناسب استفاده کنید.
  • برای پوشه‌های عمومی قابل‌نوشتن از Sticky Bit استفاده کنید.
  • فایل‌های SetUID و SetGID را دوره‌ای بررسی کنید.
  • بعد از chmod روی فایل ACLدار، ACL Mask را بررسی کنید.
  • SELinux را با chmod اشتباه نگیرید.
  • قبل از تغییر گسترده از Permissionها Backup تهیه کنید.
  • از --preserve-root در عملیات بازگشتی استفاده کنید.
  • در Scriptها مسیر / و متغیر خالی را مسدود کنید.
  • Permissionها را براساس نیاز واقعی سرویس تنظیم کنید.
  • فقط حداقل Permission لازم را اختصاص دهید.

اشتباهات رایج

موارد زیر از اشتباهات متداول هنگام استفاده از chmod هستند:

  • استفاده بی‌دلیل از 777
  • اجرای chmod -R 755 روی تمام فایل‌ها
  • دادن Execute به فایل‌های عادی
  • اشتباه‌گرفتن Permission فایل و پوشه
  • ندادن Execute به پوشه والد
  • نادیده‌گرفتن مالک و گروه
  • تصور اینکه chmod مالکیت را تغییر می‌دهد
  • نادیده‌گرفتن ACL Mask
  • نادیده‌گرفتن SELinux
  • استفاده از Wildcard بدون پیش‌نمایش
  • اجرای chmod بازگشتی روی مسیر اشتباه
  • حذف SetUID یا SetGID بدون بررسی
  • فعال‌کردن SetUID روی برنامه ناامن
  • استفاده از Sticky Bit در مسیر نامناسب
  • نادیده‌گرفتن Mount Optionهایی مانند noexec
  • تغییر Permission فایل‌های سیستمی بدون Backup
  • استفاده از Permission یکسان برای فایل و پوشه

چک‌لیست نهایی

پس از اجرای chmod موارد زیر را بررسی کنید:

  • مسیر هدف صحیح است.
  • نوع فایل یا پوشه مشخص شده است.
  • Permission قبلی بررسی شده است.
  • Permission جدید حداقل دسترسی لازم را می‌دهد.
  • فایل‌های معمولی بدون نیاز Executable نشده‌اند.
  • پوشه‌ها مجوز x لازم را دارند.
  • مالک و گروه صحیح هستند.
  • پوشه‌های والد Permission مناسب دارند.
  • ACL فایل بررسی شده است.
  • ACL Mask دسترسی را محدود نمی‌کند.
  • SetUID و SetGID بررسی شده‌اند.
  • Sticky Bit در صورت نیاز تنظیم شده است.
  • SELinux یا AppArmor بررسی شده است.
  • Mount Optionها بررسی شده‌اند.
  • سرویس یا برنامه موردنظر آزمایش شده است.
  • از عملیات Recursive روی مسیر اشتباه جلوگیری شده است.
  • Permissionها بعد از تغییر با stat تأیید شده‌اند.
  • Session مدیریتی تا پایان آزمایش باز مانده است.

دستورات پرکاربرد chmod

نمایش Permission:

ls -l file

نمایش عددی:

stat -c '%a %A %U %G %n' file

فایل عمومی:

chmod 644 file

فایل محدود:

chmod 640 file

فایل خصوصی:

chmod 600 file

Script عمومی:

chmod 755 script.sh

Script محدود:

chmod 750 script.sh

پوشه عمومی:

chmod 755 directory

پوشه محدود:

chmod 750 directory

پوشه خصوصی:

chmod 700 directory

افزودن Execute:

chmod +x script.sh

حذف Write از Other:

chmod o-w file

اعمال بازگشتی کنترل‌شده:

chmod -R u=rwX,g=rX,o= directory

تنظیم فایل‌ها و پوشه‌ها به‌صورت جداگانه:

find directory -type d -exec chmod 750 {} +
find directory -type f -exec chmod 640 {} +

SetGID روی پوشه:

chmod 2770 directory

Sticky Bit:

chmod 1777 directory

کپی Permission:

chmod --reference=source destination

جمع‌بندی

دستور chmod برای تغییر مجوز فایل‌ها و پوشه‌های موجود در لینوکس استفاده می‌شود. مجوزهای اصلی شامل Read، Write و Execute هستند و برای مالک، گروه مالک و سایر کاربران به‌صورت جداگانه تعریف می‌شوند.

Permission را می‌توان به دو روش تنظیم کرد:

Numeric mode
Symbolic mode

در روش عددی، مقادیر 4، 2 و 1 به‌ترتیب نمایانگر Read، Write و Execute هستند. برای مثال:

644 = Owner read/write, Group read, Other read
640 = Owner read/write, Group read, Other none
600 = Owner read/write only
755 = Owner full, Group read/execute, Other read/execute
750 = Owner full, Group read/execute, Other none

هنگام تغییر بازگشتی بهتر است Permission فایل‌ها و پوشه‌ها جداگانه تنظیم شود. استفاده از X بزرگ نیز از Executable شدن ناخواسته فایل‌های معمولی جلوگیری می‌کند.

مجوزهای ویژه SetUID، SetGID و Sticky Bit قابلیت‌های بیشتری فراهم می‌کنند، اما باید با دقت استفاده شوند. همچنین در فایل‌های دارای ACL، اجرای chmod می‌تواند ACL Mask و دسترسی مؤثر کاربران را تغییر دهد.

پس از هر تغییر باید مالکیت، ACL، SELinux، Permission پوشه‌های والد و کاربر واقعی سرویس بررسی شوند. تنظیم Permission براساس اصل کمترین سطح دسترسی، نقش مهمی در امنیت و پایداری سیستم لینوکسی دارد.

هنوز نیاز به کمک دارید؟

آیا سوالی دارید؟

آیا این مقاله برای شما مفید بود؟ بله خیر

مطالب اخیراً بازدیدشده

  • عیب‌یابی تفاوت نتیجه DNS بین سرور و کامپیوتر شخصی
  • مشاهده بیشتر

نظرات خود را بنویسید... لغو پاسخ

اشتراک گذاری این مقاله

آموزش دستور chmod در لینوکس

کپی کردن لینک

Clipboard Icon

جدیدترین مقالات

آموزش نصب و راه‌اندازی RustDesk Server با Docker
آموزش نصب و راه‌اندازی RustDesk Server با Docker
2 minutes جولای 2, 2026
آموزش نصب و راه‌اندازی Matrix Synapse + Element Web + Coturn با Docker روی ...
4 minutes جولای 2, 2026
CXS چیست و چگونه کار می‌کند
1 minute می 3, 2026
ساخت سرور چت المنت بروی لینوکس
5 minutes آوریل 25, 2026
Geo Routing و Geo DNS
2 minutes آوریل 22, 2026

تقویم

آگوست 2026
شیدسچپج
1234567
891011121314
15161718192021
22232425262728
293031 
« جولای    

عضویت

جدیدترین پست‌ها

آموزش نصب و راه‌اندازی RustDesk Server با Docker
آموزش نصب و راه‌اندازی RustDesk Server با Docker
2 minutes جولای 2, 2026
آموزش نصب و راه‌اندازی Matrix Synapse + Element Web + Coturn با Docker روی Ubuntu 24.04
4 minutes جولای 2, 2026
CXS چیست و چگونه کار می‌کند
1 minute می 3, 2026
ساخت سرور چت المنت بروی لینوکس
5 minutes آوریل 25, 2026
Geo Routing و Geo DNS
2 minutes آوریل 22, 2026

سلام