دستورات chown و chgrp
هر فایل و دایرکتوری در لینوکس، علاوه بر مجوزهای دسترسی (که در بخشهای پیشین بررسی شد)، دارای دو مشخصهٔ هویتی است:
-
مالک (Owner / User): کاربری که مالک آن فایل یا دایرکتوری محسوب میشود.
-
گروه (Group): گروهی که فایل یا دایرکتوری به آن تعلق دارد.
مجوزهای دسترسی (r، w، x) بر اساس همین دو مشخصه اعمال میشوند: دستهٔ u (مالک) و g (گروه) و o (سایرین). برای تغییر این دو مشخصه، از دو دستور اختصاصی chown و chgrp استفاده میشود. تغییر مالکیت معمولاً نیاز به دسترسی 超级用户 (root) یا استفاده از sudo دارد.
برای مشاهدهٔ مالک و گروه فعلی یک فایل، از ls -l استفاده کنید:
ls -l document.txt -rw-r--r-- 1 alireza developers 1024 Jan 1 12:00 document.txt
در خروجی بالا، alireza مالک فایل و developers گروه آن است.
دستور chown (Change Owner)
دستور chown برای تغییر مالک و بهطور همزمان گروه یک فایل یا دایرکتوری به کار میرود. این دستور انعطافپذیری بالایی دارد و میتواند فقط مالک، فقط گروه، یا هر دو را همزمان تغییر دهد.
سینتکس کلی
chown [OPTION]... [OWNER][:[GROUP]] FILE...
بخش [OWNER][:[GROUP]] حالتهای مختلفی دارد که در جدول زیر شرح داده شده است:
| حالت ورودی | معنی و کاربرد |
|---|---|
newowner | فقط مالک را به newowner تغییر میدهد (گروه بدون تغییر میماند). |
newowner:newgroup | مالک را به newowner و گروه را به newgroup تغییر میدهد. |
newowner: | مالک را به newowner تغییر میدهد و گروه را برابر با گروه اصلی (Primary Group) کاربر newowner تنظیم میکند. |
:newgroup | فقط گروه را به newgroup تغییر میدهد (مالک بدون تغییر میماند). معادل دستور chgrp است. |
مثالهای کاربردی
# 1. تغییر فقط مالک فایل به کاربر 'maryam' sudo chown maryam report.pdf # 2. تغییر مالک به 'root' و گروه به 'admin' بهصورت همزمان sudo chown root:admin /etc/nginx/nginx.conf # 3. تغییر مالک به 'www-data' و تنظیم گروه برابر با گروه اصلی کاربر www-data sudo chown www-data: /var/www/html/index.html # 4. تغییر فقط گروه به 'staff' (مالک به همان شکل قبلی میماند) sudo chown :staff project_data.csv
گزینههای مهم chown
| گزینه | توضیح |
|---|---|
-R, --recursive | اعمال تغییرات بهصورت بازگشتی روی تمام فایلها و زیردایرکتوریها |
-v, --verbose | نمایش جزئیات تغییرات انجامشده برای هر فایل |
--from=CURRENT_OWNER:CURRENT_GROUP | تغییر مالکیت فقط در صورتی که مالک و گروه فعلی با مقدار مشخصشده مطابقت داشته باشند (ایمنسازی) |
--reference=RFILE | اعمال مالک و گروه دقیقاً برابر با مالک و گروه فایل مرجع (RFILE) |
-h, --no-dereference | تأثیر روی خود لینک سمبلیک، نه فایل مقصد آن (توضیح بیشتر در ادامه) |
استفاده از --from برای امنیت بیشتر
فرض کنید اسکریپتی دارید که باید مالکیت را تغییر دهد، اما نمیخواهید بهاشتباه فایلی را تغییر دهید که قبلاً دستکاری شده است. گزینهٔ --from این اطمینان را ایجاد میکند:
# فقط در صورتی مالکیت را به 'newuser' تغییر بده که مالک فعلی 'olduser' باشد sudo chown --from=olduser newuser important_file.txt
کپی کردن مالکیت از یک فایل مرجع
# تنظیم مالک و گروه file2 دقیقاً برابر با file1 sudo chown --reference=file1 file2
دستور chgrp (Change Group)
دستور chgrp بهطور اختصاصی برای تغییر گروه یک فایل یا دایرکتوری طراحی شده است و معادل استفاده از chown :newgroup است. در برخی توزیعها، استفاده از chgrp برای وضوح بیشتر یا در اسکریپتهای قدیمی ترجیح داده میشود.
سینتکس کلی
chgrp [OPTION]... GROUP FILE...
مثالهای کاربردی
# تغییر گروه فایل به 'developers' sudo chgrp developers app.js # تغییر گروه یک دایرکتوری به 'www-data' (بدون تأثیر روی محتویات داخلی) sudo chgrp www-data /var/www/myapp/
گزینههای مهم chgrp
| گزینه | توضیح |
|---|---|
-R, --recursive | اعمال تغییر گروه بهصورت بازگشتی |
-v, --verbose | نمایش جزئیات تغییرات |
--reference=RFILE | تنظیم گروه فایل فعلی برابر با گروه فایل مرجع |
-h, --no-dereference | تأثیر روی خود لینک سمبلیک، نه فایل مقصد |
تغییرات بازگشتی (Recursive) با -R
مانند chmod، هر دو دستور chown و chgrp با گزینهٔ -R میتوانند مالکیت را در کل یک درخت دایرکتوری تغییر دهند.
# تغییر مالک و گروه کل دایرکتوری پروژه به کاربر و گروه 'deployer' sudo chown -R deployer:deployer /home/deployer/myapp/ # تغییر گروه تمام محتویات دایرکتوری uploads به 'apache' sudo chgrp -R apache /var/www/uploads/
هشدار امنیتی: تغییر مالکیت بازگشتی روی دایرکتوریهای سیستمی (مانند
/etc،/binیا/var) میتواند کل سیستم را از کار بیندازد و دسترسی به سرویسهای حیاتی را غیرممکن کند. همیشه تغییرات را ابتدا روی یک فایل آزمایشی امتحان کنید و مسیر را دقیق بررسی کنید.
رفتار با لینکهای سمبلیک (Symbolic Links)
رفتار پیشفرض chown و chgrp این است که اگر مسیر موردنظر یک لینک سمبلیک باشد، دستور روی فایل مقصد (target) اعمال میشود، نه خود لینک. برای تغییر مالکیت خودِ لینک سمبلیک، باید از گزینهٔ -h (یا --no-dereference) استفاده کرد.
# ایجاد یک لینک سمبلیک ln -s /etc/hosts my_link # مشاهده مالکیت (مالکیت فایل مقصد یعنی /etc/hosts را نشان میدهد) ls -l my_link lrwxrwxrwx 1 root root 10 Jan 1 12:00 my_link -> /etc/hosts # تغییر مالکیت خودِ لینک (نه فایل /etc/hosts) sudo chown -h user1:user1 my_link # بررسی مجدد - حالا خود لینک مالکیتش تغییر کرده است ls -l my_link lrwxrwxrwx 1 user1 user1 10 Jan 1 12:01 my_link -> /etc/hosts
نکته حرفهای: لینکهای سمبلیک معمولاً مجوزهایشان اهمیتی ندارد (چون همیشه
lrwxrwxrwxنشان داده میشود)، اما مالکیت آنها در برخی سناریوهای امنیتی یا هنگام بکآپگیری باtarاهمیت پیدا میکند.
اشتباهات رایج و نکات کلیدی
۱. تفاوت chown user:group با chown user:
-
chown user:group file: هم مالک و هم گروه را بهطور مشخص تغییر میدهد. -
chown user: file: مالک را تغییر میدهد و گروه را برابر با گروه اصلی (Primary Group) آن کاربر جدید تنظیم میکند (معمولاً نام گروهی همنام با نام کاربر).
۲. نیاز به دسترسی root
اکثر تغییرات مالکیت نیاز به دسترسی sudo دارند، زیرا کاربران معمولی اجازه ندارند مالکیت فایلهای دیگران را تغییر دهند (بهجز در شرایط خاص که کاربر مالک فایل است و میتواند گروه را به گروههایی که خودش عضو آنهاست تغییر دهد).
۳. تأثیر روی مجوزها
تغییر مالکیت، مجوزهای دسترسی (rwx) را تغییر نمیدهد؛ فقط مشخص میکند که این مجوزها برای کدام کاربر و گروه اعمال شوند.
۴. اعتبارسنجی نامها
لینوکس case-sensitive است، پس نام کاربری Alireza با alireza تفاوت دارد. همچنین اگر نام کاربر یا گروه وجود نداشته باشد، خطای invalid user یا invalid group دریافت میکنید.
# خطا: کاربر 'nonexistent' وجود ندارد sudo chown nonexistent file.txt chown: invalid user: ‘nonexistent’
برای اطمینان از وجود کاربر یا گروه، از دستورات زیر استفاده کنید:
# بررسی وجود کاربر id username # بررسی وجود گروه getent group groupname
۵. نگهداری مالکیت در بکآپ
اگر از دستوراتی مانند cp یا rsync استفاده میکنید، معمولاً مالکیت فایل مقصد به کاربری که دستور را اجرا میکند تغییر میکند. برای حفظ مالکیت اصلی در انتقال فایلها، از گزینههای -p (preserve) در cp یا -o و -g در rsync استفاده کنید (نیازمند دسترسی root است).
جمعبندی سریع مقایسهای
| دستور | کاربرد اصلی | معادل دیگر | نیاز به sudo |
|---|---|---|---|
chown newowner file | تغییر مالک | - | معمولاً بله |
chown :newgroup file | تغییر گروه | chgrp newgroup file | معمولاً بله |
chown newowner:newgroup file | تغییر همزمان مالک و گروه | - | بله |
chgrp newgroup file | تغییر گروه | chown :newgroup file | معمولاً بله |