دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • 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 در لینوکس؛ مدیریت دسترسی گروه‌ها و اجرای برنامه‌ها
لینوکس

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

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

مقدمه

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

دستور chown برای تغییر مالک کاربری، گروه مالک یا هر دو مورد استفاده می‌شود. این دستور یکی از ابزارهای اصلی مدیریت Permission در لینوکس است و در سناریوهایی مانند انتقال فایل میان کاربران، اصلاح مالکیت فایل‌های وب‌سایت، بازیابی Backup و مدیریت فایل‌های سرویس‌ها کاربرد دارد.

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

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

  • مفهوم مالک و گروه فایل
  • ساختار دستور chown
  • تغییر مالک یا گروه
  • استفاده از UID و GID
  • تغییر بازگشتی مالکیت
  • مدیریت Symbolic Linkها
  • کپی مالکیت از فایل دیگر
  • استفاده ایمن از --from
  • سناریوهای کاربردی وب‌سرور و پوشه اشتراکی
  • ارتباط chown با Permission، ACL و SELinux
  • رفع خطاهای رایج

مالک فایل در لینوکس چیست؟

هر فایل یا پوشه در لینوکس دارای دو مشخصه اصلی مالکیت است:

User owner
Group owner

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

برای مثال:

User owner: ali
Group owner: developers

در این حالت:

  • Permissionهای بخش Owner برای کاربر ali اعمال می‌شوند.
  • Permissionهای بخش Group برای اعضای گروه developers اعمال می‌شوند.
  • سایر کاربران از Permissionهای بخش Other استفاده می‌کنند.

مشاهده مالک و گروه فایل

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

ls -l report.txt

نمونه خروجی:

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

بخش‌های مهم:

Owner: ali
Group: developers

در خروجی ls -l، نام مالک بعد از تعداد Hard Linkها و نام گروه بعد از مالک نمایش داده می‌شود.


مشاهده مالکیت پوشه

ls -ld /srv/project

نمونه خروجی:

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

گزینه -d باعث می‌شود اطلاعات خود پوشه نمایش داده شود، نه محتوای داخل آن.


مشاهده جزئیات با stat

stat report.txt

نمونه خروجی:

File: report.txt
Size: 2048
Access: (0640/-rw-r-----)
Uid: ( 1001/     ali)
Gid: ( 1500/developers)

برای نمایش خلاصه:

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

نمونه خروجی:

640 ali developers 1001 1500 report.txt

ترتیب خروجی:

Permissions Owner Group UID GID File

دستور chown چیست؟

دستور chown مخفف Change Owner است و برای تغییر مالک کاربری و گروه مالک فایل یا پوشه استفاده می‌شود.

ساختار کلی:

chown [OPTIONS] OWNER[:GROUP] FILE

چند حالت رایج:

OWNER FILE
OWNER:GROUP FILE
:GROUP FILE
OWNER: FILE

هرکدام از این ساختارها رفتار متفاوتی دارند.


چه کسی می‌تواند مالک فایل را تغییر دهد؟

در حالت معمول، فقط کاربر root یا کاربری که دسترسی مناسب sudo دارد می‌تواند مالک یک فایل را به کاربر دیگری تغییر دهد.

برای مثال:

sudo chown ali report.txt

یک کاربر معمولی نمی‌تواند فایل خود را به کاربر دیگری واگذار کند؛ زیرا این قابلیت می‌تواند برای دورزدن محدودیت‌های Disk Quota یا مسائل امنیتی استفاده شود.

کاربر مالک فایل معمولاً می‌تواند گروه فایل را به یکی از گروه‌هایی تغییر دهد که خودش عضو آن است؛ البته این رفتار ممکن است تحت تأثیر فایل‌سیستم و سیاست‌های امنیتی قرار گیرد.


بررسی وجود کاربر و گروه

قبل از اجرای chown مطمئن شوید کاربر و گروه مقصد وجود دارند.

بررسی کاربر:

id ali

نمونه خروجی:

uid=1001(ali) gid=1001(ali) groups=1001(ali),1500(developers)

بررسی گروه:

getent group developers

نمونه خروجی:

developers:x:1500:ali,reza

اگر کاربر یا گروه وجود نداشته باشد، chown با خطا متوقف می‌شود.


تغییر مالک کاربری فایل

برای تغییر فقط مالک کاربری:

sudo chown ali report.txt

سپس بررسی کنید:

ls -l report.txt

نمونه خروجی:

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

در این حالت فقط مالک کاربری تغییر کرده و گروه قبلی حفظ شده است.


تغییر هم‌زمان مالک و گروه

برای تغییر مالک کاربری و گروه مالک:

sudo chown ali:developers report.txt

بررسی:

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

خروجی:

ali developers report.txt

ساختار دستور:

OWNER:GROUP

استفاده از نقطه به‌جای دونقطه

در بعضی سیستم‌ها ساختار زیر نیز پشتیبانی می‌شود:

sudo chown ali.developers report.txt

اما استفاده از : توصیه می‌شود:

sudo chown ali:developers report.txt

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


تغییر فقط گروه فایل با chown

برای تغییر گروه بدون تغییر مالک:

sudo chown :developers report.txt

بررسی:

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

نمونه خروجی:

ali developers report.txt

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

برای تغییر گروه می‌توان از دستور chgrp نیز استفاده کرد:

sudo chgrp developers report.txt

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


استفاده از OWNER بدون تعیین گروه

دستور زیر فقط مالک کاربری را تغییر می‌دهد:

sudo chown ali report.txt

گروه فعلی فایل حفظ می‌شود.


استفاده از OWNER همراه با دونقطه خالی

دستور زیر رفتار متفاوتی دارد:

sudo chown ali: report.txt

در این حالت:

  • مالک فایل به ali تغییر می‌کند.
  • گروه فایل به گروه Login اصلی کاربر ali تغییر می‌کند.

برای مشاهده گروه اصلی کاربر:

id -gn ali

نمونه خروجی:

ali

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

sudo chown ali: report.txt

معمولاً نتیجه‌ای مشابه این خواهد داشت:

Owner: ali
Group: ali

این دستور را با chown ali report.txt اشتباه نگیرید.


تغییر مالکیت چند فایل

برای تغییر مالک چند فایل:

sudo chown ali:developers file1.txt file2.txt file3.txt

بررسی:

stat -c '%U %G %n' file1.txt file2.txt file3.txt

نمونه خروجی:

ali developers file1.txt
ali developers file2.txt
ali developers file3.txt

می‌توان از Wildcard نیز استفاده کرد:

sudo chown ali:developers *.txt

قبل از استفاده از Wildcard، فایل‌های منطبق را بررسی کنید:

printf '%s\n' *.txt

تغییر مالکیت یک پوشه

برای تغییر مالکیت خود پوشه:

sudo chown ali:developers /srv/project

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

بررسی:

ls -ld /srv/project

نمونه خروجی:

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

تغییر بازگشتی مالکیت

برای تغییر مالکیت پوشه و تمام محتوای داخل آن از گزینه -R استفاده کنید:

sudo chown -R ali:developers /srv/project

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

Target directory
Files inside the directory
Subdirectories
Files inside subdirectories

برای بررسی بخشی از نتیجه:

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

نمونه خروجی:

ali developers /srv/project
ali developers /srv/project/index.html
ali developers /srv/project/config
ali developers /srv/project/config/app.conf

خطر استفاده از chown -R

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

نمونه بسیار خطرناک:

sudo chown -R ali:developers /

تغییر مالکیت مسیرهای سیستمی می‌تواند باعث اختلال در موارد زیر شود:

SSH
sudo
systemd
Package manager
Web server
Database
Authentication
Boot process

قبل از اجرای Recursive، مسیر را بررسی کنید:

realpath /srv/project

سپس محتوای سطح اول را مشاهده کنید:

find /srv/project -maxdepth 1 -ls

برای محافظت بیشتر:

sudo chown --preserve-root -R ali:developers /srv/project

گزینه --preserve-root از اجرای بازگشتی روی مسیر / جلوگیری می‌کند.


نمایش تغییرات با گزینه verbose

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

sudo chown -Rv ali:developers /srv/project

نمونه خروجی:

changed ownership of '/srv/project/index.html' from root:root to ali:developers
changed ownership of '/srv/project/config' from root:root to ali:developers
changed ownership of '/srv/project' from root:root to ali:developers

گزینه -v حتی فایل‌هایی را که مالکیت آن‌ها تغییر نکرده است نیز گزارش می‌کند.


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

برای نمایش فقط فایل‌هایی که مالکیتشان تغییر کرده است:

sudo chown -Rc ali:developers /srv/project

گزینه -c مخفف Changes است.

نمونه خروجی:

changed ownership of '/srv/project/index.html' from root:root to ali:developers

اگر فایلی از قبل مالکیت صحیح داشته باشد، نمایش داده نمی‌شود.


استفاده از حالت quiet

برای مخفی‌کردن بیشتر پیام‌های خطا:

sudo chown -f ali:developers report.txt

گزینه -f یا --silent پیام‌های خطای عادی را کاهش می‌دهد.

در عملیات مدیریتی مهم، استفاده از -f توصیه نمی‌شود؛ زیرا ممکن است خطاهای مهم دیده نشوند.


تغییر مالکیت با UID و GID

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

مشاهده UID:

id -u ali

نمونه خروجی:

1001

مشاهده GID:

getent group developers

نمونه خروجی:

developers:x:1500:ali,reza

تغییر مالکیت با UID و GID:

sudo chown 1001:1500 report.txt

بررسی:

stat -c '%u %g %U %G %n' report.txt

خروجی:

1001 1500 ali developers report.txt

کاربرد UID و GID عددی

استفاده از شناسه عددی در شرایط زیر کاربرد دارد:

  • کاربر مقصد هنوز روی سیستم تعریف نشده است.
  • Backup از سرور دیگری منتقل شده است.
  • فایل‌ها داخل Container یا Volume قرار دارند.
  • نام کاربران میان دو سیستم متفاوت است.
  • NFS یا Storage مشترک از UID/GID استفاده می‌کند.
  • مالک فایل به‌صورت عددی و بدون نام نمایش داده می‌شود.

فایل‌های دارای مالک ناشناخته

اگر کاربری حذف شود اما فایل‌های او باقی بمانند، ls ممکن است UID را به‌صورت عددی نمایش دهد:

ls -ln orphan-file.txt

نمونه خروجی:

-rw------- 1 1050 1050 1024 Jul 25 10:30 orphan-file.txt

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

sudo find / -xdev -nouser -ls 2>/dev/null

برای یافتن فایل‌های بدون گروه معتبر:

sudo find / -xdev -nogroup -ls 2>/dev/null

برای تغییر مالک فایل‌های UID مشخص:

sudo find /srv/data -xdev -uid 1050 -exec chown ali {} +

برای تغییر هم‌زمان مالک و گروه:

sudo find /srv/data -xdev -uid 1050 -exec chown ali:developers {} +

استفاده ایمن از گزینه –from

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

ساختار:

chown --from=CURRENT_OWNER:CURRENT_GROUP NEW_OWNER:NEW_GROUP FILE

نمونه:

sudo chown --from=root:root ali:developers report.txt

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

اگر مالک فعلی متفاوت باشد، فایل تغییر نمی‌کند.

این گزینه برای Migrationها و Scriptهای خودکار ایمن‌تر است.


استفاده بازگشتی از –from

sudo chown -R \
--from=olduser:oldgroup \
newuser:newgroup \
/srv/project

این دستور فقط فایل‌هایی را تغییر می‌دهد که دقیقاً متعلق به olduser:oldgroup باشند.

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


تغییر براساس فقط مالک فعلی

sudo chown --from=olduser newuser report.txt

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

تغییر فقط براساس گروه فعلی:

sudo chown --from=:oldgroup :newgroup report.txt

کپی مالکیت از فایل دیگر

برای تنظیم مالکیت یک فایل براساس فایل مرجع از گزینه --reference استفاده کنید:

sudo chown --reference=source.txt destination.txt

بررسی:

stat -c '%U %G %n' source.txt destination.txt

نمونه خروجی:

ali developers source.txt
ali developers destination.txt

این روش احتمال اشتباه در نام کاربر یا گروه را کاهش می‌دهد.


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

sudo chown --reference=/srv/template /srv/project

این دستور فقط مالکیت خود /srv/project را تغییر می‌دهد.

برای اعمال روی محتوای داخل پوشه نیز باید گزینه بازگشتی را جداگانه مدیریت کنید؛ اما استفاده مستقیم از --reference همراه با ساختارهای متفاوت باید با دقت انجام شود، زیرا همه فایل‌ها مالکیت یک مرجع واحد را دریافت می‌کنند.


تغییر گروه با دستور chgrp

اگر فقط قصد تغییر گروه را دارید، استفاده از chgrp خواناتر است:

sudo chgrp developers report.txt

معادل تقریبی با chown:

sudo chown :developers report.txt

تغییر بازگشتی گروه:

sudo chgrp -R developers /srv/project

یا:

sudo chown -R :developers /srv/project

تفاوت chown و chmod

دستور chown مالکیت را تغییر می‌دهد:

sudo chown ali:developers report.txt

دستور chmod Permission را تغییر می‌دهد:

sudo chmod 640 report.txt

نتیجه ترکیبی:

Owner: ali
Group: developers
Permissions: 640

این دو دستور جایگزین یکدیگر نیستند.

دستورکاربرد
chownتغییر مالک و گروه
chgrpتغییر گروه
chmodتغییر Permission
setfaclتعریف Permission پیشرفته
umaskتعیین Permission پیش‌فرض فایل‌های جدید

تغییر مالکیت براساس نوع فایل

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

برای تغییر فقط فایل‌ها:

sudo find /srv/project \
-type f \
-exec chown ali:developers {} +

برای تغییر فقط پوشه‌ها:

sudo find /srv/project \
-type d \
-exec chown ali:developers {} +

برای تغییر فقط فایل‌های با پسوند خاص:

sudo find /srv/project \
-type f \
-name '*.log' \
-exec chown syslog:adm {} +

قبل از اجرای -exec، نتیجه جست‌وجو را مشاهده کنید:

find /srv/project -type f -name '*.log' -print

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

گزینه -xdev در دستور find مانع ورود به فایل‌سیستم‌های Mount شده دیگر می‌شود:

sudo find /srv/project \
-xdev \
-user olduser \
-exec chown newuser:newgroup {} +

این گزینه برای جلوگیری از تغییر ناخواسته مالکیت در NFS، CIFS، Volumeها یا Mountهای جداگانه مفید است.


مدیریت Symbolic Linkها

Symbolic Link یا Symlink به فایل یا پوشه دیگری اشاره می‌کند.

برای مشاهده:

ls -l current-config

نمونه خروجی:

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

رفتار chown روی Symlinkها باید با دقت مدیریت شود.


تغییر مالک فایل مقصد

در حالت معمول، دستور زیر معمولاً فایل مقصد Symlink را تغییر می‌دهد:

sudo chown ali:developers current-config

برای بررسی فایل مقصد:

stat -L -c '%U %G %n' current-config

تغییر مالک خود Symbolic Link

برای تغییر مالک خود Link از گزینه -h استفاده کنید:

sudo chown -h ali:developers current-config

بررسی خود Link:

stat -c '%U %G %n' current-config

گزینه -h مانع Dereference شدن Symbolic Link می‌شود.


گزینه‌های -H، -L و -P در حالت بازگشتی

هنگام استفاده بازگشتی، رفتار نسبت به Symbolic Linkها با گزینه‌های زیر کنترل می‌شود.

گزینه -P

sudo chown -R -P ali:developers /srv/project

Symbolic Linkهای مشاهده‌شده در پیمایش دنبال نمی‌شوند.

این حالت برای عملیات بازگشتی معمولاً امن‌تر است.


گزینه -H

sudo chown -R -H ali:developers /srv/project-link

اگر Argument اصلی دستور یک Symbolic Link به پوشه باشد، همان Link اولیه دنبال می‌شود؛ اما Symlinkهای دیگری که در طول پیمایش دیده می‌شوند دنبال نمی‌شوند.


گزینه -L

sudo chown -R -L ali:developers /srv/project

تمام Symbolic Linkهای اشاره‌کننده به پوشه‌ها دنبال می‌شوند.

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

از -L در عملیات بازگشتی فقط زمانی استفاده کنید که ساختار تمام Symlinkها را می‌شناسید.


مثال عملی انتقال فایل بین کاربران

فرض کنید فایل متعلق به کاربر olduser است:

ls -l report.txt

خروجی:

-rw-r----- 1 olduser oldgroup 2048 Jul 25 10:30 report.txt

مالک و گروه را تغییر دهید:

sudo chown newuser:newgroup report.txt

بررسی:

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

خروجی:

newuser newgroup report.txt

اگر قصد دارید فقط فایل‌هایی با مالک قبلی تغییر کنند:

sudo chown \
--from=olduser:oldgroup \
newuser:newgroup \
report.txt

مثال عملی اصلاح مالکیت Home Directory

پوشه Home کاربر معمولاً باید متعلق به همان کاربر و گروه اصلی او باشد.

بررسی:

ls -ld /home/ali

نمونه مشکل:

drwx------ 8 root root 4096 Jul 25 10:30 /home/ali

اصلاح مالکیت پوشه و محتوای آن:

sudo chown -R ali:ali /home/ali

بررسی:

find /home/ali -maxdepth 1 -printf '%u %g %p\n'

نمونه خروجی:

ali ali /home/ali
ali ali /home/ali/.bashrc
ali ali /home/ali/.profile
ali ali /home/ali/.ssh

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


اصلاح مالکیت فایل‌های SSH

sudo chown -R ali:ali /home/ali/.ssh

Permissionهای مناسب را نیز بررسی کنید:

sudo chmod 700 /home/ali/.ssh
sudo chmod 600 /home/ali/.ssh/authorized_keys

بررسی:

stat -c '%a %U %G %n' \
/home/ali/.ssh \
/home/ali/.ssh/authorized_keys

خروجی:

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

مالکیت یا Permission اشتباه در .ssh می‌تواند باعث خطای ورود با SSH Key شود.


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

فرض کنید فایل‌های سایت در مسیر زیر قرار دارند:

/var/www/example.com

کاربر Deploy برابر deployer و گروه وب‌سرور در Ubuntu برابر www-data است:

sudo chown -R deployer:www-data /var/www/example.com

بررسی:

find /var/www/example.com \
-maxdepth 1 \
-printf '%u %g %p\n'

نمونه خروجی:

deployer www-data /var/www/example.com
deployer www-data /var/www/example.com/public
deployer www-data /var/www/example.com/storage

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

  • کاربر deployer فایل‌ها را مدیریت می‌کند.
  • وب‌سرور فقط از Permission گروه استفاده می‌کند.
  • Permission فایل‌ها و پوشه‌ها نیز صحیح تنظیم شده‌اند.

مالک سرویس وب‌سرور در توزیع‌های مختلف

نام کاربر سرویس ممکن است متفاوت باشد:

Ubuntu Apache/Nginx common user: www-data
AlmaLinux Apache common user: apache
Nginx package user may be: nginx

قبل از اجرای chown کاربر واقعی Process را بررسی کنید:

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

همچنین Unit سرویس را بررسی کنید:

systemctl status nginx
systemctl status apache2
systemctl status httpd
systemctl status php-fpm

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

دستور زیر بدون بررسی توصیه نمی‌شود:

sudo chown -R www-data:www-data /var/www/example.com

اگر وب‌سرور مالک تمام فایل‌های برنامه باشد، آسیب‌پذیری برنامه ممکن است امکان تغییر تمام Source Codeها را فراهم کند.

روش مناسب‌تر معمولاً این است که فقط پوشه‌های نیازمند نوشتن در اختیار سرویس قرار گیرند:

sudo chown -R www-data:www-data /var/www/example.com/storage
sudo chown -R www-data:www-data /var/www/example.com/cache
sudo chown -R www-data:www-data /var/www/example.com/uploads

مسیرهای دقیق به برنامه مورداستفاده بستگی دارند.


مثال عملی فایل‌های WordPress

در یک ساختار رایج، مالک اصلی فایل‌ها می‌تواند کاربر اکانت باشد و گروه، گروه وب‌سرور:

sudo chown -R siteuser:www-data /var/www/example.com

پوشه Uploadها که PHP باید در آن بنویسد:

sudo chown -R siteuser:www-data \
/var/www/example.com/wp-content/uploads

در بعضی معماری‌ها ممکن است سرویس PHP-FPM با همان کاربر سایت اجرا شود؛ در این صورت مالکیت باید مطابق Pool Configuration تعیین شود.

کاربر PHP-FPM را بررسی کنید:

ps -eo user,group,comm | grep php-fpm

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


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

ابتدا گروه را ایجاد کنید:

sudo groupadd developers

کاربران را اضافه کنید:

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

پوشه را ایجاد کنید:

sudo mkdir -p /srv/developers

مالک و گروه:

sudo chown root:developers /srv/developers

فعال‌کردن SetGID و دسترسی گروهی:

sudo chmod 2770 /srv/developers

بررسی:

ls -ld /srv/developers

خروجی:

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

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

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


مثال عملی Docker Volume

ممکن است Container با UID مشخصی مانند 1000 اجرا شود:

docker exec app id

نمونه خروجی:

uid=1000(app) gid=1000(app) groups=1000(app)

برای اصلاح مالکیت Volume روی Host:

sudo chown -R 1000:1000 /opt/app/data

بررسی:

stat -c '%u %g %n' /opt/app/data

خروجی:

1000 1000 /opt/app/data

استفاده از UID و GID در Docker مهم است؛ زیرا نام کاربر داخل Container ممکن است روی Host وجود نداشته باشد.


مثال عملی پایگاه داده

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

برای MariaDB:

sudo chown -R mysql:mysql /var/lib/mysql

برای PostgreSQL ممکن است مسیر و کاربر متفاوت باشد:

sudo chown -R postgres:postgres /var/lib/pgsql

این دستورها را فقط زمانی اجرا کنید که مسیر دقیق Data Directory و کاربر سرویس را تأیید کرده باشید.

برای مشاهده تنظیم سرویس:

systemctl status mariadb
systemctl status postgresql

پیش از تغییر مالکیت Data Directory، سرویس را متوقف کرده و Backup معتبر داشته باشید.


بررسی فایل‌های متعلق به یک کاربر

برای پیدا کردن فایل‌های متعلق به کاربر ali در یک مسیر:

sudo find /srv -user ali -ls

برای نمایش خلاصه:

sudo find /srv -user ali -printf '%u %g %p\n'

برای یافتن فایل‌های متعلق به یک گروه:

sudo find /srv -group developers -ls

برای یافتن UID مشخص:

sudo find /srv -uid 1001 -ls

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

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

find /srv/project -user olduser -print

پس از تأیید:

sudo find /srv/project \
-user olduser \
-exec chown newuser:newgroup {} +

این روش از اجرای مستقیم chown -R کنترل‌شده‌تر است.


حفظ مالکیت هنگام کپی فایل‌ها

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

برای حفظ Attributeها:

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

گزینه -a تلاش می‌کند موارد زیر را حفظ کند:

Ownership
Permissions
Timestamps
Symbolic links
ACLs
Extended attributes

برای بررسی:

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

حفظ مالکیت با rsync

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

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

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

اجرای rsync بدون دسترسی کافی ممکن است نتواند مالکیت اصلی را بازیابی کند.


حفظ مالکیت در tar

تهیه آرشیو:

sudo tar --acls --xattrs \
-cpf backup.tar \
/srv/project

بازیابی:

sudo tar --acls --xattrs \
-xpf backup.tar

در مهاجرت میان سیستم‌ها، تطابق UID و GID را نیز بررسی کنید.


ارتباط chown با ACL

تغییر مالک یا گروه می‌تواند نحوه محاسبه دسترسی ACL را تغییر دهد، حتی اگر ACLهای نام‌گذاری‌شده حذف نشوند.

قبل از تغییر:

getfacl report.txt

نمونه خروجی:

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

پس از تغییر گروه:

sudo chown :auditors report.txt

دوباره بررسی کنید:

getfacl report.txt

اعضای گروه مالک جدید از Entry مربوط به group:: استفاده خواهند کرد.

بعد از تغییر مالکیت فایل‌های دارای ACL، دسترسی مؤثر کاربران را آزمایش کنید:

sudo -u reza cat report.txt

ارتباط chown با SetUID و SetGID

تغییر مالکیت یک فایل اجرایی ممکن است باعث پاک‌شدن Bitهای SetUID یا SetGID شود.

قبل از تغییر:

ls -l application

نمونه:

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

پس از chown ممکن است خروجی به‌شکل زیر تغییر کند:

-rwxr-xr-x 1 ali developers 4096 Jul 25 10:30 application

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

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

ارتباط chown با Linux Capabilities

تغییر مالکیت فایل ممکن است Linux File Capabilityهای آن را پاک کند.

قبل از تغییر:

getcap /usr/local/bin/application

نمونه خروجی:

/usr/local/bin/application cap_net_bind_service=ep

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

getcap /usr/local/bin/application

اگر Capability حذف شده باشد، باید فقط در صورت نیاز و با بررسی امنیتی دوباره تنظیم شود:

sudo setcap cap_net_bind_service=ep \
/usr/local/bin/application

ارتباط chown با SELinux

chown مالک و گروه Unix را تغییر می‌دهد، اما SELinux Context یک لایه جداگانه است.

در AlmaLinux، Rocky Linux و RHEL وضعیت SELinux را بررسی کنید:

getenforce

نمونه خروجی:

Enforcing

مشاهده Context:

ls -Z /var/www/example.com

اگر مالکیت صحیح است اما سرویس همچنان خطای Permission دارد، SELinux Context را بررسی کنید:

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

خطاهای SELinux:

sudo ausearch -m AVC -ts recent

غیرفعال‌کردن SELinux راه‌حل مناسب برای مشکل مالکیت نیست.


ارتباط chown با NFS

در NFS ممکن است رفتار مالکیت تحت تأثیر موارد زیر باشد:

UID and GID mapping
root_squash
NFS server permissions
Identity mapping
Export options

ممکن است اجرای chown با کاربر root روی NFS با خطای زیر مواجه شود:

Operation not permitted

نوع Mount را بررسی کنید:

findmnt -T /mnt/nfs/data -o TARGET,FSTYPE,OPTIONS

تنظیمات مالکیت در NFS باید روی Server و Client هماهنگ باشند.


ارتباط chown با Hard Link

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

بررسی 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

تغییر مالکیت:

sudo chown reza:auditors file1

بررسی:

ls -li file1 file2

خروجی:

123456 -rw-r----- 2 reza auditors 2048 Jul 25 10:30 file1
123456 -rw-r----- 2 reza auditors 2048 Jul 25 10:30 file2

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

در Scriptهای مدیریتی موارد زیر را رعایت کنید:

  • مسیرها را داخل Variable مشخص تعریف کنید.
  • خالی‌نبودن Variable را بررسی کنید.
  • از -- قبل از مسیر استفاده کنید.
  • از --from برای کنترل مالک قبلی استفاده کنید.
  • نتیجه را ثبت و بررسی کنید.
  • مسیر / را صریحاً مسدود کنید.

نمونه:

#!/bin/bash

set -euo pipefail

target="/srv/project"
new_owner="ali"
new_group="developers"

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/chown \
    --preserve-root \
    -R \
    "$new_owner:$new_group" \
    -- "$target"

وجود -- باعث می‌شود مسیرهایی که با - شروع می‌شوند به‌عنوان Option تفسیر نشوند.


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

به‌جای ایجاد فایل و سپس اجرای chown، می‌توان از دستور 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

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


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

خطای invalid user

نمونه:

chown: invalid user: 'ali:developers'

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

getent passwd ali

گروه را بررسی کنید:

getent group developers

در صورت نبود کاربر یا گروه، ابتدا آن‌ها را ایجاد کنید.


خطای Operation not permitted

نمونه:

chown: changing ownership of 'report.txt': Operation not permitted

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

  • کاربر دسترسی root ندارد.
  • فایل روی NFS با root_squash قرار دارد.
  • فایل‌سیستم Read-only است.
  • فایل Immutable است.
  • Container Capability لازم را ندارد.
  • فایل‌سیستم تغییر مالکیت را پشتیبانی نمی‌کند.
  • Storage از Mapping خاصی استفاده می‌کند.

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

sudo chown ali:developers report.txt

بررسی Read-only بودن فایل‌سیستم

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

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

ro

فایل‌سیستم Read-only است.


بررسی Immutable Attribute

lsattr report.txt

نمونه:

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

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

برای حذف موقت Attribute:

sudo chattr -i report.txt

سپس:

sudo chown ali:developers report.txt

در صورت نیاز Attribute را دوباره فعال کنید:

sudo chattr +i report.txt

خطای No such file or directory

نمونه:

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

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

ls -l report.txt

مسیر Absolute را پیدا کنید:

realpath report.txt

در Scriptها ترجیحاً از مسیر کامل استفاده کنید.


مالکیت تغییر کرده اما سرویس هنوز Permission denied می‌دهد

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

  1. Permission فایل و پوشه
  2. Permission پوشه‌های والد
  3. ACL
  4. SELinux یا AppArmor
  5. کاربر واقعی سرویس
  6. Read-only بودن Mount
  7. File Capability
  8. سرویس داخل Container
  9. Group Membership
  10. نیاز به Restart سرویس

بررسی مسیر:

namei -l /srv/project/report.txt

بررسی ACL:

getfacl /srv/project/report.txt

بررسی Process:

ps -eo user,group,comm | grep application

chown -R بسیار طولانی است

تعداد فایل‌ها را بررسی کنید:

find /srv/project -xdev | wc -l

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

Millions of small files
Mounted storage
Network filesystem
Container volumes
Cache directories
Symbolic links

برای محدودکردن به فایل‌سیستم فعلی از find -xdev استفاده کنید:

sudo find /srv/project \
-xdev \
-exec chown ali:developers {} +

مالکیت پس از Extract اشتباه است

آرشیو ممکن است UID و GID سیستم مبدأ را حفظ کرده باشد.

بررسی:

find /srv/restore \
-maxdepth 2 \
-printf '%u %g %p\n'

اصلاح:

sudo chown -R \
--preserve-root \
siteuser:sitegroup \
/srv/restore

برای Migrationهای حساس، Mapping کاربران مبدأ و مقصد را پیش از تغییر ثبت کنید.


مالک به‌صورت عدد نمایش داده می‌شود

نمونه:

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

سیستم نامی برای UID یا GID پیدا نکرده است.

بررسی:

getent passwd 1005
getent group 1005

در صورت نیاز مالک جدید تعیین کنید:

sudo chown ali:developers report.txt

chown روی Symbolic Link فایل مقصد را تغییر داده است

برای تغییر خود Link از گزینه -h استفاده کنید:

sudo chown -h ali:developers current-config

خود Link را بدون Dereference بررسی کنید:

stat -c '%U %G %N' current-config

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

  • قبل از اجرای chown -R مسیر را با realpath بررسی کنید.
  • در عملیات بازگشتی از --preserve-root استفاده کنید.
  • ابتدا فایل‌های هدف را با find نمایش دهید.
  • برای Migrationها از --from استفاده کنید.
  • فقط مسیرهای ضروری را تغییر دهید.
  • کل Document Root را بدون بررسی به کاربر وب‌سرور واگذار نکنید.
  • برای پوشه‌های اشتراکی از Group Ownership و SetGID استفاده کنید.
  • UID و GID را در Docker، NFS و Backupها بررسی کنید.
  • روی Symbolic Linkها رفتار -h، -H، -L و -P را در نظر بگیرید.
  • بعد از تغییر فایل اجرایی، SetUID، SetGID و Capability را بررسی کنید.
  • بعد از تغییر مالکیت در AlmaLinux، SELinux Context را بررسی کنید.
  • مالکیت Home و .ssh را با دقت تنظیم کنید.
  • از chown -R روی /etc، /usr، /bin و /var بدون دلیل مشخص خودداری کنید.
  • در Scriptها Variable خالی و مسیر / را مسدود کنید.
  • خروجی تغییرات گسترده را ثبت کنید.
  • قبل از اصلاح Data Directory دیتابیس Backup تهیه کنید.
  • مالکیت را براساس کاربر واقعی Process تعیین کنید، نه براساس حدس.

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

موارد زیر از خطاهای رایج هنگام استفاده از chown هستند:

  • اجرای chown -R روی مسیر اشتباه
  • تغییر مالکیت کل /var/www به کاربر وب‌سرور
  • اشتباه‌گرفتن chown ali با chown ali:
  • استفاده از کاربر یا گروهی که وجود ندارد
  • نادیده‌گرفتن UID و GID در Container
  • دنبال‌کردن ناخواسته Symbolic Linkها
  • تغییر مالک فایل اجرایی بدون بررسی SetUID یا Capability
  • تغییر مالکیت بدون بررسی ACL
  • تصور اینکه chown Permission را نیز اصلاح می‌کند
  • استفاده از Wildcard بدون پیش‌نمایش
  • تغییر Data Directory دیتابیس در زمان فعال بودن سرویس
  • نادیده‌گرفتن SELinux
  • اجرای Script با Variable مسیر خالی
  • تغییر مالکیت NFS بدون بررسی Mapping
  • بستن Session مدیریتی قبل از آزمایش سرویس‌ها

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

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

  • کاربر مقصد وجود دارد.
  • گروه مقصد وجود دارد.
  • مسیر هدف صحیح است.
  • مسیر با realpath بررسی شده است.
  • عملیات بازگشتی واقعاً لازم است.
  • از --preserve-root استفاده شده است.
  • Symbolic Linkها بررسی شده‌اند.
  • مالک و گروه جدید با stat تأیید شده‌اند.
  • Permissionها با chmod یا stat بررسی شده‌اند.
  • ACL فایل بررسی شده است.
  • SetUID و SetGID بررسی شده‌اند.
  • File Capability بررسی شده است.
  • SELinux Context بررسی شده است.
  • کاربر واقعی سرویس تأیید شده است.
  • سرویس موردنظر آزمایش شده است.
  • فایل‌های بدون مالک یا گروه باقی نمانده‌اند.
  • هیچ Mount ناخواسته‌ای تغییر نکرده است.
  • Log یا خروجی عملیات گسترده ذخیره شده است.

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

مشاهده مالکیت:

ls -l file

نمایش دقیق:

stat -c '%a %U %G %u %g %n' file

تغییر فقط مالک:

sudo chown ali file

تغییر مالک و گروه:

sudo chown ali:developers file

تغییر فقط گروه:

sudo chown :developers file

تغییر مالک و گروه اصلی همان کاربر:

sudo chown ali: file

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

sudo chown --preserve-root -R ali:developers directory

نمایش فقط تغییرات:

sudo chown -Rc ali:developers directory

تغییر خود Symbolic Link:

sudo chown -h ali:developers symlink

تغییر شرطی:

sudo chown \
--from=olduser:oldgroup \
newuser:newgroup \
file

کپی مالکیت از فایل مرجع:

sudo chown --reference=source destination

یافتن فایل‌های بدون مالک:

sudo find / -xdev -nouser -ls 2>/dev/null

یافتن فایل‌های یک کاربر:

sudo find /srv -user ali -ls

جمع‌بندی

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

ساختارهای اصلی آن عبارت‌اند از:

chown OWNER FILE
chown OWNER:GROUP FILE
chown :GROUP FILE
chown OWNER: FILE

دستور chown ali file فقط مالک را تغییر می‌دهد؛ اما chown ali: file علاوه بر مالک، گروه فایل را نیز به گروه اصلی کاربر ali تغییر می‌دهد.

برای تغییر بازگشتی از گزینه -R استفاده می‌شود، اما این گزینه باید همراه با بررسی دقیق مسیر و ترجیحاً --preserve-root اجرا شود. همچنین در Migrationها و Scriptها استفاده از --from می‌تواند از تغییر فایل‌هایی با مالکیت غیرمنتظره جلوگیری کند.

پس از تغییر مالکیت باید Permissionها، ACL، Symbolic Linkها، SetUID، SetGID، File Capability و SELinux Context بررسی شوند. صحیح‌بودن مالکیت به‌تنهایی تضمین نمی‌کند که سرویس بتواند به فایل دسترسی داشته باشد.

استفاده کنترل‌شده از chown، همراه با اصل کمترین سطح دسترسی، نقش مهمی در امنیت و پایداری سرور لینوکسی دارد.

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

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

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

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

  • نحوه ارسال تیکت در پنل کاربری
  • Sticky Bit در لینوکس چیست؟ آموزش افزایش امنیت پوشه‌های اشتراکی
  • آموزش بررسی etc/resolv.conf/ و عیب‌یابی مشکلات DNS در لینوکس
  • آموزش کانفیگ صحیح exim
  • مشاهده بیشتر

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

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

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

کپی کردن لینک

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

سلام