توی این درس یاد میگیری هر فایل و پوشهی لینوکس سه دسته دسترسی دارد: برای مالک (user)، برای گروه (group) و برای بقیه (others)؛ و هر دسته سه حق: خواندن (r)، نوشتن (w) و اجرا (x). خروجی ls -l (مثل -rwxr-xr-x) را میخوانی، با chmod در دو شکل عددی (755) و نمادین (u+x) دسترسی را عوض میکنی، با chown مالک و گروه را تغییر میدهی، و با umask پیشفرض فایلهای تازه را میفهمی. همه را روی چند کاربر واقعی امتحان میکنی تا ببینی «چه کسی چه کاری میتواند». تمرین: یک اسکریپت را فقط برای خودت اجرایی میکنی.
مسئله: همه نباید به همهچیز دسترسی داشته باشند
Section titled “مسئله: همه نباید به همهچیز دسترسی داشته باشند”روی یک سرور مشترک، فایل رمزهای دیتابیس نباید برای همه خواندنی باشد، اسکریپت دیپلوی فقط باید توسط تیم اجرا شود و فایلهای سایت را فقط وبسرور بخواند. دسترسیها این قواعد را در خود فایل ثبت میکنند. اگر درست تنظیم نشوند، یا کسی که نباید میخواند/مینویسد (خطر امنیتی)، یا کسی که باید نمیتواند (خطای Permission denied که همهی تازهکارها میبینند).
تشبیه: قفل و کلید اتاق
Section titled “تشبیه: قفل و کلید اتاق”هر اتاق (فایل) سه نوع آدم دارد: صاحب اتاق، اعضای یک تیم مشخص و بقیهی ساختمان. برای هر دسته جدا تعیین میکنی: «میتواند وارد شود و ببیند (r)، چیزی بگذارد/عوض کند (w)، یا اتاق را اجرا کند / از آن عبور کند (x)». برای پوشهها (که «اتاق» هستند) این سه حق معنی کمی متفاوت دارند (در مثال ۳).
مثالهای عملی
Section titled “مثالهای عملی”برای آزمایش واقعی چند کاربر لازم است. دو کاربر (bob و carol) و یک گروه (team) میسازیم که bob عضو آن است و carol نیست (ساختن کاربر را در درس قبل دیدی):
sudo useradd -m -s /bin/bash bobsudo useradd -m -s /bin/bash carolsudo groupadd teamsudo usermod -aG team alisudo usermod -aG team bobecho "bob: $(id -Gn bob)"echo "carol: $(id -Gn carol)"mkdir -p /tmp/permdemo && chmod 755 /tmp/permdemobob: bob teamcarol: carolیک تابع کوچک برای اجرای دستور بهجای کاربر دیگر (sudo -u) هم مینویسیم تا نتیجهی هر کاربر را ببینیم:
as() { sudo -u "$1" "${@:2}" 2>&1; }cd /tmp/permdemoecho "من: $(whoami)"; as bob whoami; as carol whoamiمن: alibobcarolمثال ۱: خواندن ls -l
Section titled “مثال ۱: خواندن ls -l”cd /tmp/permdemoecho "محتوای گزارش" > report.txtls -l report.txtecho "--- بخشها:"stat -c 'نوع و دسترسی: %A | عددی: %a | مالک: %U | گروه: %G | نام: %n' report.txt-rw-r--r-- 1 ali ali 24 Oct 3 20:29 report.txt--- بخشها:نوع و دسترسی: -rw-r--r-- | عددی: 644 | مالک: ali | گروه: ali | نام: report.txtرشتهی -rw-r--r-- ده کاراکتر است: اولی نوع (- فایل، d پوشه، l لینک)، بعد سهتاسهتا: مالک (rw-: بخواند و بنویسد)، گروه (r--: فقط بخواند) و بقیه (r--: فقط بخواند). بعدش مالک (ali) و گروه (ali). حالا ببین کاربرهای دیگر چه میتوانند (فایل جدید با 644 ساخته شد، یعنی همه میخوانند ولی فقط مالک مینویسد):
cd /tmp/permdemoecho "--- bob میخواند:"; as bob cat report.txtecho "--- carol میخواند:"; as carol cat report.txtecho "--- bob مینویسد:"; as bob sh -c 'echo hack >> report.txt'--- bob میخواند:محتوای گزارش--- carol میخواند:محتوای گزارش--- bob مینویسد:sh: 1: cannot create report.txt: Permission deniedخواندن برای همه آزاد است (r برای others) ولی نوشتن فقط برای مالک: bob و carol خطای Permission denied میگیرند.
مثال ۲: chmod عددی
Section titled “مثال ۲: chmod عددی”هر دسته یک رقم است: r=4، w=2، x=1 و جمعشان:
| رقم | معنی | حروف |
|---|---|---|
| 7 | ۴+۲+۱ | rwx |
| 6 | ۴+۲ | rw- |
| 5 | ۴+۱ | r-x |
| 4 | ۴ | r-- |
| 0 | هیچ | --- |
سه رقم برای (مالک، گروه، بقیه). رایجترینها: 644 (فایل عادی)، 755 (برنامه یا پوشه)، 600 (خصوصی)، 700 (پوشهی خصوصی):
cd /tmp/permdemofor m in 644 600 640 755 700; do touch "f-$m"; chmod $m "f-$m"donestat -c '%a %A %n' f-* | sort600 -rw------- f-600640 -rw-r----- f-640644 -rw-r--r-- f-644700 -rwx------ f-700755 -rwxr-xr-x f-755مثلاً 640 یعنی مالک rw- (۶)، گروه r-- (۴)، بقیه --- (۰): مالک میخواند و مینویسد، گروه فقط میخواند و بقیه هیچ. و 755: مالک همهچیز (۷)، گروه و بقیه بخوانند و اجرا کنند (۵).
دسترسی rw-r----- با کدام عدد نوشته میشود؟
مالک rw- = ۶، گروه r-- = ۴، بقیه --- = ۰.
مثال ۳: دسترسی روی فایل در برابر پوشه
Section titled “مثال ۳: دسترسی روی فایل در برابر پوشه”معنی r و w و x برای دو نوع متفاوت است:
| فایل | پوشه | |
|---|---|---|
| r | خواندن محتوا | فهرست کردن اسمها (ls) |
| w | تغییر محتوا | ساختن، حذف و تغییر نام آیتمهای داخل (به شرط x) |
| x | اجرا بهعنوان برنامه | وارد شدن (cd) و دسترسی به آیتمهای داخل با نام |
اهمیت x روی پوشه را ببین:
cd /tmp/permdemomkdir secret && echo "داخل" > secret/file.txtchmod 755 secretecho "--- 755: bob فهرست و فایل را میبیند:"as bob ls secret; as bob cat secret/file.txtchmod 644 secret # r بدون xecho "--- 644 (r بدون x): فهرست میشود ولی فایل قابلدسترسی نیست:"as bob ls secret; as bob cat secret/file.txtchmod 711 secret # x بدون recho "--- 711 (x بدون r): فهرست نه، ولی با اسم دقیق میشود رسید:"as bob ls secret; as bob cat secret/file.txtchmod 700 secretecho "--- 700: هیچچیز برای bob:"as bob ls secret--- 755: bob فهرست و فایل را میبیند:file.txtداخل--- 644 (r بدون x): فهرست میشود ولی فایل قابلدسترسی نیست:file.txtcat: secret/file.txt: Permission denied--- 711 (x بدون r): فهرست نه، ولی با اسم دقیق میشود رسید:ls: cannot open directory 'secret': Permission deniedداخل--- 700: هیچچیز برای bob:ls: cannot open directory 'secret': Permission deniedr بدون x: اسمها دیده میشوند (لیست) ولی نمیشود به محتوا رسید. x بدون r: نمیتوانی فهرست بگیری ولی اگر اسم را دقیق بدانی، فایل قابلخواندن است (برای «پوشهی تحویل» جالب است). برای کار عادی با پوشهها معمولاً rx با هم لازماند (755).
مثال ۴: نمادین، chmod u+x
Section titled “مثال ۴: نمادین، chmod u+x”بهجای عدد میتوانی بگویی چه کسی (u/g/o/a) چه چیزی (+ اضافه، - حذف، = دقیقاً) چه حقی (r/w/x):
cd /tmp/permdemotouch sym.txt; chmod 644 sym.txtecho "شروع: $(stat -c %A sym.txt)"chmod u+x sym.txt; echo "u+x: $(stat -c %A sym.txt)"chmod g+w sym.txt; echo "g+w: $(stat -c %A sym.txt)"chmod o-r sym.txt; echo "o-r: $(stat -c %A sym.txt)"chmod a+r sym.txt; echo "a+r: $(stat -c %A sym.txt)"chmod u=rw,g=r,o= sym.txt; echo "u=rw,g=r,o=: $(stat -c %A sym.txt)"chmod go-rwx sym.txt; echo "go-rwx: $(stat -c %A sym.txt)"شروع: -rw-r--r--u+x: -rwxr--r--g+w: -rwxrw-r--o-r: -rwxrw----a+r: -rwxrw-r--u=rw,g=r,o=: -rw-r-----go-rwx: -rw-------u=user، g=group، o=others، a=all (همه). + اضافه، - حذف، = مقدار دقیق (بقیهی حقوق آن دسته پاک میشود). نمادین وقتی خوب است که فقط یک حق را عوض کنی و بقیه را دستنخورده بخواهی؛ عددی وقتی همه را یکجا تعیین میکنی.
مثال ۵: اسکریپت اجرایی (تمرین اصلی)
Section titled “مثال ۵: اسکریپت اجرایی (تمرین اصلی)”برای اجرای یک اسکریپت با ./script.sh باید x داشته باشد:
cd /tmp/permdemoprintf '#!/bin/bash\necho "سلام از اسکریپت"\n' > hello.shls -l hello.sh | cut -c1-10./hello.shecho "--- اجرایی کردن فقط برای خودم (700):"chmod 700 hello.shls -l hello.sh | cut -c1-10./hello.shecho "--- bob (دیگران) نمیتواند:"as bob sh -c '/tmp/permdemo/hello.sh'-rw-r--r--bash: ./hello.sh: Permission denied--- اجرایی کردن فقط برای خودم (700):-rwx------سلام از اسکریپت--- bob (دیگران) نمیتواند:sh: 1: /tmp/permdemo/hello.sh: Permission deniedبدون x خطای Permission denied و بعد از chmod 700 فقط من (مالک) اجرا میکنم. (با bash hello.sh میشود بدون x هم اجرا کرد، چون آنجا bash فایل را میخواند و x لازم نیست؛ ولی r لازم است.) خط اول اسکریپت (#!/bin/bash، shebang) میگوید با چه مفسری اجرا شود.
مثال ۶: گروه، فایلی که فقط تیم میبیند
Section titled “مثال ۶: گروه، فایلی که فقط تیم میبیند”سناریوی واقعی: گزارش را به گروه team بده و دسترسی 640 بگذار؛ اعضای تیم بخوانند، بقیه نه:
cd /tmp/permdemoecho "گزارش محرمانه" > team-report.txtsudo chgrp team team-report.txtchmod 640 team-report.txtls -l team-report.txtecho "--- bob (عضو team):"; as bob cat team-report.txtecho "--- carol (غیر عضو):"; as carol cat team-report.txtecho "--- bob مینویسد (گروه فقط r):"; as bob sh -c 'echo x >> /tmp/permdemo/team-report.txt'-rw-r----- 1 ali team 26 Oct 3 20:29 team-report.txt--- bob (عضو team):گزارش محرمانه--- carol (غیر عضو):cat: team-report.txt: Permission denied--- bob مینویسد (گروه فقط r):sh: 1: cannot create /tmp/permdemo/team-report.txt: Permission deniedbob (عضو گروه) میخواند ولی نمینویسد، و carol هیچچیز ندارد. برای اینکه تیم هم بنویسد: chmod 660 (rw-rw----).
مثال ۷: ترتیب بررسی، مالک اول است!
Section titled “مثال ۷: ترتیب بررسی، مالک اول است!”لینوکس دسترسی را بهترتیب مالک ← گروه ← بقیه بررسی میکند و اولین دستهای که تو در آن هستی را اعمال میکند؛ به بقیه نگاه نمیکند. نتیجهی عجیب:
cd /tmp/permdemoecho "عجیب" > odd.txtchmod 077 odd.txt # مالک هیچ، گروه و بقیه همهچیزls -l odd.txt | cut -c1-10echo "--- مالک (من):"; cat odd.txtecho "--- carol (بقیه):"; as carol cat odd.txtchmod u+rw odd.txt # برگرداندن----rwxrwx--- مالک (من):cat: odd.txt: Permission denied--- carol (بقیه):عجیبمالک (من) نمیتواند فایل خودش را بخواند، ولی carol میتواند! چون سیستم مرا «مالک» میبیند و فقط --- مالک را اعمال میکند. (مالک همیشه میتواند با chmod دسترسی را برگرداند.) و root این قواعد را دور میزند و به همهچیز دسترسی دارد (درس root و sudo).
مثال ۸: مالکیت، chown و chgrp
Section titled “مثال ۸: مالکیت، chown و chgrp”مالک و گروه را با chown عوض میکنی (به دسترسی مدیر نیاز دارد؛ کاربر عادی نمیتواند فایل خودش را به دیگری بدهد):
cd /tmp/permdemotouch owned.txtls -l owned.txt | awk '{print "قبل:", $3, $4}'sudo chown bob owned.txt; ls -l owned.txt | awk '{print "chown bob:", $3, $4}'sudo chown bob:team owned.txt; ls -l owned.txt | awk '{print "chown bob:team:", $3, $4}'sudo chown :ali owned.txt; ls -l owned.txt | awk '{print "chown :ali (فقط گروه):", $3, $4}'echo "--- بدون sudo (کاربر عادی):"chown ali owned.txtecho "--- بازگشتی روی پوشه (-R):"mkdir -p tree/sub && touch tree/a tree/sub/bsudo chown -R bob:team treefind tree | sort | while read -r f; do stat -c '%U:%G %n' "$f"; doneقبل: ali alichown bob: bob alichown bob:team: bob teamchown :ali (فقط گروه): bob ali--- بدون sudo (کاربر عادی):chown: changing ownership of 'owned.txt': Operation not permitted--- بازگشتی روی پوشه (-R):bob:team treebob:team tree/abob:team tree/subbob:team tree/sub/bشکلها: chown کاربر فایل، chown کاربر:گروه فایل، chown :گروه فایل (فقط گروه، مثل chgrp). -R بازگشتی روی پوشه و همهی داخلش.
مثال ۹: umask، پیشفرض فایلهای جدید
Section titled “مثال ۹: umask، پیشفرض فایلهای جدید”فایل جدید با چه دسترسیای ساخته میشود؟ umask یک «ماسک» است که از دسترسی کامل (فایلها ۶۶۶، پوشهها ۷۷۷) کم میکند:
cd /tmp/permdemoecho "umask فعلی: $(umask) (نمادین: $(umask -S))"touch u-file; mkdir u-dirstat -c '%a %n' u-file u-direcho "--- umask 077 (خصوصی):"umask 077touch p-file; mkdir p-dirstat -c '%a %n' p-file p-direcho "--- umask 002 (گروه هم بنویسد):"umask 002touch g-file; mkdir g-dirstat -c '%a %n' g-file g-dirumask 022umask فعلی: 0022 (نمادین: u=rwx,g=rx,o=rx)644 u-file755 u-dir--- umask 077 (خصوصی):600 p-file700 p-dir--- umask 002 (گروه هم بنویسد):664 g-file775 g-dirبا 022: فایل 666-022=644 و پوشه 777-022=755. با 077: 600 و 700 (فقط مالک)؛ با 002: 664 و 775 (گروه هم مینویسد، برای پروژههای تیمی). فایل جدید هرگز خودکار x نمیگیرد (برای همین ۶۶۶ پایه است). umask فقط برای همین shell و فرزندانش است؛ برای ماندگاری در ~/.bashrc بنویس.
مثال ۱۰: دیدن دسترسیها در طول مسیر، namei
Section titled “مثال ۱۰: دیدن دسترسیها در طول مسیر، namei”برای رسیدن به یک فایل باید به همهی پوشههای مسیر x داشته باشی. namei -l دسترسی هر جزء مسیر را نشان میدهد:
cd /tmp/permdemomkdir -p deep/dir && echo hi > deep/dir/file.txtchmod 700 deep # بقیه حق عبور ندارندnamei -l /tmp/permdemo/deep/dir/file.txtecho "--- carol با اینکه فایل 644 است:"as carol cat /tmp/permdemo/deep/dir/file.txtchmod 755 deepecho "--- بعد از 755 روی deep:"as carol cat /tmp/permdemo/deep/dir/file.txtf: /tmp/permdemo/deep/dir/file.txtdrwxr-xr-x root root /drwxrwxrwt root root tmpdrwxr-xr-x ali ali permdemodrwx------ ali ali deepdrwxr-xr-x ali ali dir-rw-r--r-- ali ali file.txt--- carol با اینکه فایل 644 است:cat: /tmp/permdemo/deep/dir/file.txt: Permission denied--- بعد از 755 روی deep:hinamei نشان میدهد deep (با drwx------) مسیر را میبندد؛ حتی با فایل خواندنی، carol نمیتواند عبور کند. وقتی «Permission denied» میبینی و فایل خودش دسترسی دارد، namei -l را بزن: معمولاً یکی از پوشههای بالا x ندارد.
sudo rm -rf /tmp/permdemosudo userdel -r bob 2>/dev/null; sudo userdel -r carol 2>/dev/null; sudo groupdel teamecho "پاکسازی شد"پاکسازی شدپشت پرده: دسترسی کجا ذخیره میشود و چطور بررسی میشود؟
Section titled “پشت پرده: دسترسی کجا ذخیره میشود و چطور بررسی میشود؟”دسترسیها داخل inode (درس لینکها) فایل ذخیره میشوند: ۹ بیت rwx (سه گروه سهتایی)، بههمراه UID مالک و GID گروه. هر بار که یک پروسه فایلی را باز میکند، هسته UID/GID های پروسه (درس کاربرها) را با مالک/گروه فایل مقایسه میکند: اگر UID پروسه با مالک برابر بود، فقط بیتهای مالک را میسنجد؛ وگرنه اگر گروه پروسه (اصلی یا اضافی) با گروه فایل برابر بود، بیتهای گروه؛ و در غیر این صورت بیتهای others. root (UID 0) این بررسی را دور میزند (با capability ها، درسهای بعد).
برای تغییر دسترسی باید مالک فایل (یا root) باشی؛ مالک بودن یعنی اختیار تغییر دسترسی، نه لزوماً داشتن دسترسی خواندن. chmod فقط inode را عوض میکند، پس همهی لینکهای سخت (hard link) به آن inode هم فوراً دسترسی جدید را میبینند؛ و chmod روی symlink روی مقصد اثر میگذارد. دسترسیهای پیچیدهتر (برای کاربران خاص بدون گروهسازی) را ACL (setfacl/getfacl) فراهم میکند که فراتر از این درس است.
جدولهای مرجع
Section titled “جدولهای مرجع”| دستور | کار |
|---|---|
ls -l |
نمایش دسترسیها |
ls -ld پوشه |
دسترسی خود پوشه |
stat -c '%a %A %U:%G %n' f |
دسترسی عددی/نمادین و مالک |
chmod 644 f |
عددی |
chmod u+x f |
نمادین (افزودن اجرا برای مالک) |
chmod -R 755 dir |
بازگشتی |
chmod u=rw,g=r,o= f |
تعیین دقیق |
chown user:group f |
مالک و گروه (نیاز به sudo) |
chgrp group f |
فقط گروه |
umask / umask 077 |
دیدن/تعیین ماسک |
namei -l مسیر |
دسترسی همهی اجزای مسیر |
| عدد | نماد | کاربرد رایج |
|---|---|---|
| 644 | rw-r–r– | فایل عادی |
| 600 | rw—–– | فایل خصوصی (.env، کلید) |
| 755 | rwxr-xr-x | برنامه، پوشهی عمومی |
| 700 | rwx—— | پوشهی خصوصی (~/.ssh) |
| 640 | rw-r—– | خواندنی برای گروه |
| 664 / 775 | rw-rw-r– / rwxrwxr-x | پروژهی تیمی (با umask 002) |
| 777 | rwxrwxrwx | هرگز (همهچیز برای همه) |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) chmod 777 برای رفع «Permission denied»
Section titled “۱) chmod 777 برای رفع «Permission denied»”دسترسی ۷۷۷ مشکل را «حل» میکند ولی هر کاربر یا برنامهی دیگری (حتی مهاجم) میتواند فایل را بخواند، بنویسد و اجرا کند. راهحل: علت واقعی را پیدا کن (مالک/گروه اشتباه، x روی پوشه)، و حداقل دسترسی لازم را بده.
۲) فراموش کردن x روی پوشه
Section titled “۲) فراموش کردن x روی پوشه”مثال ۳ و ۱۰: بدون x روی پوشهها به محتوا نمیرسی. راهحل: namei -l، و برای پوشهها 755 یا 750.
۳) chmod -R 644 که پوشهها را بیx میکند
Section titled “۳) chmod -R 644 که پوشهها را بیx میکند”mkdir -p /tmp/m3/sub && echo hi > /tmp/m3/sub/fchmod -R 644 /tmp/m3ls /tmp/m3/sub 2>&1 | head -1cat /tmp/m3/sub/f 2>&1 | head -1chmod -R u+rwX /tmp/m3 && rm -rf /tmp/m3chmod: cannot access '/tmp/m3/sub': Permission deniedls: cannot access '/tmp/m3/sub': Permission deniedcat: /tmp/m3/sub/f: Permission denied-R 644 به پوشهها هم x را برداشت و دیگر نمیتوانی داخلشان بروی (حتی مالک). راهحل: chmod -R u=rwX,go=rX (X بزرگ: x را فقط به پوشهها و فایلهای از قبل اجرایی میدهد)، یا جدا برای فایلها و پوشهها با find -type f -exec chmod 644 {} +.
۴) ذخیرهی رمز در فایل با دسترسی باز
Section titled “۴) ذخیرهی رمز در فایل با دسترسی باز”فایل .env یا کلید خصوصی با 644 برای همه خواندنی است. راهحل: chmod 600 (و ssh اصلاً کلید خصوصی بازتر از 600 را قبول نمیکند: درس SSH).
۵) ساختن فایل با sudo در پوشهی خودت
Section titled “۵) ساختن فایل با sudo در پوشهی خودت”وقتی با sudo فایلی در پوشهی خودت میسازی (یا sudo git clone، sudo npm install میزنی)، مالک آن root میشود و بعد خودت نمیتوانی ویرایشش کنی:
mkdir -p /tmp/m5 && cd /tmp/m5sudo touch config.txtls -l config.txtecho "تنظیم جدید" >> config.txtecho "--- راهحل: برگرداندن مالکیت به خودم"sudo chown "$(id -un):$(id -gn)" config.txtls -l config.txtecho "تنظیم جدید" >> config.txt && echo "حالا مینویسم"cd / && rm -rf /tmp/m5-rw-r--r-- 1 root root 0 Oct 3 20:29 config.txtbash: config.txt: Permission denied--- راهحل: برگرداندن مالکیت به خودم-rw-r--r-- 1 ali ali 0 Oct 3 20:29 config.txtحالا مینویسمراهحل: sudo chown "$(id -un):$(id -gn)" فایل (یا با -R برای پوشه) و از این به بعد فقط دستورهایی را با sudo بزن که واقعاً لازماند. و برعکس: chown -R یا chmod -R را هرگز روی /، ~ یا /etc بیدقت نزن؛ مسیر را قبلش با pwd و ls ببین، چون سیستم را خراب میکند.
یک فایل بساز و دسترسیاش را به 640 تغییر بده؛ با ls -l و stat نشان بده مالک چه میتواند، گروه چه و بقیه چه.
دیدن جواب
touch mine.txt && chmod 640 mine.txtls -l mine.txtstat -c 'عددی=%a نمادین=%A' mine.txtecho "مالک: rw (خواندن و نوشتن) | گروه: r (فقط خواندن) | بقیه: هیچ"-rw-r----- 1 ali ali 0 Oct 3 20:29 mine.txtعددی=640 نمادین=-rw-r-----مالک: rw (خواندن و نوشتن) | گروه: r (فقط خواندن) | بقیه: هیچتمرین اصلی: یک اسکریپت را فقط برای خودت قابل اجرا کن. اسکریپت backup.sh را بساز که یک پیام چاپ کند، ابتدا ثابت کن بدون x اجرا نمیشود، بعد با chmod طوری تنظیمش کن که فقط مالک بتواند بخواند، بنویسد و اجرا کند (و دیگران هیچ حقی نداشته باشند)، و اجرایش کن.
دیدن جواب
printf '#!/bin/bash\necho "بکاپ انجام شد"\n' > backup.sh./backup.shchmod 700 backup.shls -l backup.sh | cut -c1-10./backup.shbash: ./backup.sh: Permission denied-rwx------بکاپ انجام شد700 یعنی rwx------: فقط مالک. (معادل نمادین: chmod u=rwx,go= backup.sh.)
یک پوشهی مشترک تیمی بساز که اعضای گروه team بتوانند فایل بسازند و بخوانند ولی «بقیه» هیچ دسترسی نداشته باشند: پوشه را به گروه بده، chmod 770 بگذار، و با دو کاربر (یکی عضو، یکی غیر عضو) آزمایش کن. (کاربرها را بساز و در پایان پاک کن. نکتهی فایلهای جدید: فعلاً گروه فایلها گروه اصلی سازنده است؛ در درس دسترسیهای ویژه (setgid) درست میشود.)
دیدن جواب
sudo useradd -m -s /bin/bash bob; sudo useradd -m -s /bin/bash carolsudo groupadd team; sudo usermod -aG team bobsudo mkdir /srv/teamdir && sudo chgrp team /srv/teamdir && sudo chmod 770 /srv/teamdirstat -c '%A %U:%G %n' /srv/teamdirecho "--- bob (عضو) مینویسد:"; sudo -u bob sh -c 'echo "یادداشت bob" > /srv/teamdir/note.txt && echo موفق' 2>&1echo "--- carol (غیر عضو) میخواهد ببیند:"; sudo -u carol ls /srv/teamdir 2>&1sudo rm -rf /srv/teamdir; sudo userdel -r bob 2>/dev/null; sudo userdel -r carol 2>/dev/null; sudo groupdel teamdrwxrwx--- root:team /srv/teamdir--- bob (عضو) مینویسد:موفق--- carol (غیر عضو) میخواهد ببیند:ls: cannot open directory '/srv/teamdir': Permission deniedآزمونک
Section titled “آزمونک”دسترسی rw-r----- چه عددی است؟
مالک rw-=6، گروه r--=4، بقیه ---=0.
x روی یک پوشه چه معنی دارد؟
بدون x روی پوشه به داخل نمیرسی.
برای اضافه کردن حق اجرا فقط برای مالک؟
u مالک، + افزودن، x اجرا.
umask 022 به فایل جدید چه دسترسیای میدهد؟
۶۶۶ منهای ۰۲۲ = ۶۴۴؛ پوشه: ۷۵۵.
اگر مالک فایل دسترسی --- و بقیه rwx داشته باشند، مالک میتواند فایل را بخواند؟
اولین دستهی منطبق (مالک ← گروه ← بقیه) تعیینکننده است.
کدام دستور مالک و گروه را تغییر میدهد؟
chown و chgrp مالکیت را عوض میکنند؛ chmod فقط دسترسی را.
جمعبندی
Section titled “جمعبندی”- دسترسی هر فایل: مالک (u)، گروه (g)، بقیه (o) × r (۴)، w (۲)، x (۱)؛
-rwxr-xr-x=755. - برای پوشهها:
rفهرست،wساختن/حذف آیتمها،xورود و عبور (برای رسیدن به فایل،xروی همهی پوشههای مسیر لازم است؛namei -l). chmod 644/755/600/700(عددی) یاu+x،go-rwx،u=rw,g=r,o=(نمادین)؛-Rرا با دقت (وXبزرگ) به کار ببر.chown user:groupوchgrp(نیاز به sudo)؛ بررسی دسترسی به ترتیب مالک ← گروه ← بقیه و اولین دستهی منطبق اعمال میشود؛ root دور میزند.umaskاز ۶۶۶ (فایل) و ۷۷۷ (پوشه) کم میکند؛022→644/755.chmod 777راهحل نیست؛ حداقل دسترسی لازم را بده (اصل کمترین دسترسی).
| دستور | کاری که میکند |
|---|---|
ls -l / ls -ld dir | دیدن دسترسیها |
stat -c "%a %A %U:%G %n" f | دسترسی عددی، نمادین و مالک |
chmod 644 f / chmod 755 f | فایل عادی / برنامه |
chmod 600 f / chmod 700 d | خصوصی |
chmod u+x f | اجرایی کردن برای مالک |
chmod go-rwx f | گرفتن همهی حقها از گروه و بقیه |
chmod -R u=rwX,go=rX dir | بازگشتی بدون خراب کردن x پوشهها |
sudo chown user:group f | تغییر مالک و گروه |
sudo chown -R user:group dir | بازگشتی |
umask / umask 077 | دیدن / تعیین ماسک |
namei -l /path/to/file | دسترسی همهی اجزای مسیر |
sudo -u user cmd | اجرا با هویت کاربر دیگر (برای آزمایش) |