chmod مخفف عبارت Change Mode به معنای تغییر در سطح دسترسی فایلها و فولدرها میباشد.
همانطور که میدانیم لینوکس یک سیستم عامل چند کاربره است. در لینوکس، هر فایل یا فولدر دارای یک سطح دسترسی مشخص برای هر کاربر است. یکی از علل امنیت بالاتر لینوکس نسبت به ویندوز همین مشخص بودن سطح دسترسی برای هر کاربر است. در زیر مفاهیم کاربر (user)، اجازه ها (permissions)، صاحب (owner) و گروه (group) را مشخص میکنیم و بعد دستور chmod را توضیح میدهیم.
کاربر: هر کسی که از کامپیوتر استفاده میکند یک کاربر نامیده میشود و دارای یک نام است که معمولا در ابتدای نصب سیستم عامل، این نام مشخص میشود و فرد، موقع ورود به سیستم با این نام وارد میشود. با استفاده از دستور whoami میتوان نام کاربری را به دست آورد.
اجازهها (سطح دسترسی): هر کاربر برای هر فایل یا فولدر دارای سه نوع سطح دسترسی خواندن (read)، نوشتن (write) و اجرا کردن (execute) است. این سطوح دسترسی برای فایل و فولدر کمی متفاوت است. برای فایلها، خواندن به معنای باز کردن فایل و دیدن محتویات آن است، نوشتن به معنای تغییر در محتویات فایل است و اجرا کردن هم که فقط برای فایلهای اجرایی و یا اسکریپت است، به معنای اجرا شدن آن برنامه است. برای فولدرها، خواندن به معنای لیست کردن فایلهای درون آن فولدر است، نوشتن به معنای ساختن یا پاک کردن فایلها درون فولدر است و اجرا کردن به معنای اجازه ورود به فولدر و زیر فولدرها است.
صاحب: در حالت کلی به کاربری که فایل یا فولدری را ایجاد میکند صاحب آن فایلها و فولدرها گفته میشود.
گروه: هر کاربر ممکن است به یک یا چند گروه تعلق داشته باشد. مثلا ممکن است نام کاربری majid هم به گروه majid و هم به گروه root و هم به گروه sambashare تعلق داشته باشد. در این صورت، اگر اجازههایی را برای گروه sambashare در نظر بگیریم، برای آن کاربر هم منظور میشود. همانطور که متوجه شدید، میتوان نام کاربری و نام گروه یکسانی داشت.
نکته: هر کاربری که در هیچکدام از دو دسته ی گروه و کاربر قرار نداشته باشد، به آن دیگران (others) گفته میشود.
دستور chmod
نمای کلی دستور:
$ chmod [options] [mode] [file] $ chmod [options] [octal-mode] [file]
options: پارامترهایی که برای تغییر سطح دسترسی به دستور میدهیم.
mode: نوع سطح دسترسی
octal-mode: عددی در مبنای ۸ که نوع سطح دسترسی را مشخص میکند (حالت جایگزین برای mode).
file: فایلی که میخواهیم تغییرات را روی آن انجام دهیم.
فرض کنید در پوشه home/majid/ فولدری داریم به نام myFolder که حاوی محتویات زیر است.
File1.txt File2.txt File3.txt File4.txt
حال با دستور cd وارد آن فولدر میشویم و با دستور ls و پارامتر l-
لیستی از فایلهای درون آن بدست میآوریم.
cd ~/myFolder ls -l -rw-rw-r-- 1 majid majid 6 Jan 27 07:52 File1.txt -rw-rw-r-- 1 majid majid 20 Jan 27 07:53 File2.txt -rw-rw-r-- 1 majid majid 260 Jan 27 07:53 File3.txt -rw-rw-r-- 1 majid majid 18 Jan 27 07:54 File4.txt
در ستون اول رشتهای ده کاراکتری دیده میشود که در زیر آن را توضیح میدهیم.
کاراکتر اول مشخص کننده نوع فایل است. در جدول زیر انواع فایلها مشخص شده (دقت کنید که هر چیزی در لینوکس فایل است، حتی فولدرها).
نوع فایل | کاراکتر ابتدای رشته |
---|---|
فایل معمولی | - |
فولدر | d |
symbolic link | l |
character special device | c |
block special device | b |
FIFO | p |
socket | s |
حال فرض کنید فولدری به نام myFolder1 در myFolder داشته باشیم. خط زیر به خروجی ls -l
اضافه میشود.
drwxrwxr-x 2 majid majid 4096 Jan 27 08:07 myFolder1
همانطور که میبینید، اولین کاراکتر آن به d
تغییر کرد.
۹ کارکتر بعدی به ترتیب اجازه خواندن (read)، نوشتن (write) و اجرا کردن (execute) برای به ترتیب صاحب (owner)، گروه (group) و دیگران (others) است. مثلا در خروجی بالا، برای فولدر myFolder1، صاحب دارای دسترسی rwx
، گروه دارای دسترسی rwx
و دیگران دارای دسترسی x--
هستند.
تغییر دادن سطح دسترسی به یک فایل
نمای کلی برای دستور chmod به صورت زیر است:
$ chmod [ugoa][+-][rwx] FILE_NAME
کاراکترهای موجود در کروشه های اول، به ترتیب نشاندهنده کاربر (User)، گروه (Group)، دیگران (Others) و همه (All) میباشند. میتوان یک یا چند کاراکتر از کروشه اول را در کنار هم و بدون در نظر گرفتن ترتیب استفاده کرد (توضیح در مثال پایین). از کاراکترهای +
و -
موجود در کروشه دوم تنها میتوان یکی را استفاده کرد که نشان دهنده افزودن یا کاستن سطح دسترسی مورد نظر است. از کاراکترهای r
و w
و x
موجود در کروشه سوم هم میتوان یک یا چند عدد را بهکار برد که نشان دهنده نوع دسترسی است.
مثال:
drwxrwxr-x 2 majid majid 4096 Jan 27 08:07 myFolder1 chmod ug-w myFolder1 dr-xr-xr-x 2 majid majid 4096 Jan 27 08:07 myFolder1
در این مثال، دسترسی نوشتن در فولدر myFolder1 را از کاربر و گروه گرفتیم. (دقت کنید که بین ug
و w
و -
فاصله ای وجود ندارد)
-rw-rw-r-- 1 majid majid 20 Jan 27 07:53 File2.txt chmod o+wx File2.txt -rw-rw-rwx 1 majid majid 20 Jan 27 07:53 File2.txt
در این مثال به دیگر کاربران دسترسی اجرا کردن و تغییر محتویات فایل را دادیم.
تغییر دادن سطح دسترسی به یک فایل در حالت Octal (مبنای ۸)
میتوان به ۹ کاراکتری که نشان دهنده سطح دسترسی به فایل هستند آرایه ای از اعداد ۰ و ۱ نسبت داد که صفر بودن به معنای عدم فعال بودن دسترسی آن عضو و یک بودن به معنای فعال بودن دسترسی میباشد.
rw-rw-r-- 110110100
حال اگر اعداد را سه رقم سه رقم جدا کنیم و به مبنای ۸ ببریم.
rw- rw- r-- 110 110 100 6 6 4
حال این سه عدد را در کنار هم قرار میدهیم و از آن به جای کل عبارت قبل از اسم فایل استفاده میکنیم.
-rw-rw-r-- 1 majid majid 20 Jan 27 07:53 File2.txt ( 6 6 4 ) chmod 667 File2.txt -rw-rw-rwx 1 majid majid 20 Jan 27 07:53 File2.txt ( 6 6 7 )
راه راحتتر، استفاده از جدول زیر است
نوع دسترسی | عدد اختصاص داده شده |
---|---|
x | 1 |
w | 2 |
r | 4 |
حال کافیست مثلا برای تعیین سطح دسترسی rwx بنویسیم 1+2+4=7
پارامترها:
c-
یا changes--
: مثل پارامتر v-
ولی تنها وقتی اعلام میکند که تغییرات حتما انجام شده باشد.
-rw-rw-r-- 1 majid majid 260 Jan 27 07:54 File3.txt chmod -c 777 File3.txt mode of 'File3.txt' changed from 0664 (rw-rw-r--) to 0777 (rwxrwxrwx)
v-
یا verbose--
: کارهایی که انجام میدهد را اعلام میکند.
reference=RFILE--
: از سطوح دسترسی فایل RFILE به عنوان سطوح اعمالی برای دستور استفاده میکند.
-rw-rw-r-- 1 majid majid 20 Jan 27 07:54 File2.txt -rwxrwxrwx 1 majid majid 260 Jan 27 07:54 File3.txt chmod --reference=File2.txt File3.txt -rw-rw-r-- 1 majid majid 20 Jan 27 07:54 File3.txt
R-
یا recursive--
: اگر اسم فایل مورد نظر، یک فولدر باشد، همه فایلها و فولدرهای داخل آن را با سطوح دسترسی داده شده تغییر میدهد.
ls -la total 96 drwxrwxr-x 3 majid majid 4096 Jan 27 19:35 . drwx------ 64 majid majid 36864 Jan 27 18:44 .. -rw-rw-r-- 1 majid majid 4 Jan 27 19:35 File1.txt -rw-rw-r-- 1 majid majid 20 Jan 27 07:54 File2.txt -rw-rw-r-- 1 majid majid 260 Jan 27 07:54 File3.txt -rw-rw-r-- 1 majid majid 18 Jan 27 07:54 File4.txt drwxrwx--x 2 majid majid 4096 Jan 27 08:07 myFolder1 chmod -R 777 . ls -l myFolder/ -rwxrwxrwx 1 majid majid 4 Jan 27 19:35 File1.txt -rwxrwxrwx 1 majid majid 20 Jan 27 07:54 File2.txt -rwxrwxrwx 1 majid majid 260 Jan 27 07:54 File3.txt -rwxrwxrwx 1 majid majid 18 Jan 27 07:54 File4.txt drwxrwxrwx 2 majid majid 4096 Jan 27 08:07 myFolder1
در کنار سه نوع اجازهنامه خواندن، نوشتن و اجرا کردن، سه نوع دیگر از اجازهنامه ها هستند که تاثیرشان بر روی دایرکتوریها و فایلها متفاوت است.
1. suid
فقط بر روی فایلهای با قابلیت اجرایی تاثیر دارند. اگر بر روی یک فایل با قابلیت اجرایی تنظیم شود، وقتی آن فایل اجرا شود، آن فایل با دسترسی صاحب فایل اجرا میشود و نه با دسترسی فردی که فایل را اجرا کرده. مثلا وقتی شما با دستور passwd پسوردتان را تغییر میدهید تغییراتی را داخل فایل shaddow ایجاد میکنید و از آنجایی که ایجاد تغییر در فایل shaddow فقط برای کاربر ریشه میسر است، پس باید دستور passwd با دسترسی ریشه اجرا شود، برای همین بر روی این دستور به طور پیش فرض suid تنظیم شده.
نکته: اگر suid بر روی دستوراتی مثل vi تنظیم شود، تمام کاربران به تمام فایلهای داخل سیستم دسترسی روت خواهند داشت و یک مشکل امنیتی بزرگ به وجود میآید.
2. sgid
اگر بر روی یک فایل با قابلیت اجرایی تنظیم شود وقتی آن فایل اجرا شود، با دسترسی گروه فایل اجرا میشود و نه با دسترسی گروه فردی که فایل را اجرا میکند. اگر بر روی دایرکتوری ها تنظیم شود هر فایل یا دایرکتوری که داخل اون فایل ساخته شود، گروه همان فایل را به خود اختصاص میدهد و گروه فردی که فایل را ساخته، نمیگیرد.
3. sticky
فقط بر روی دایرکتوری ها قابل تنظیم کردن است. اگر بر روی یک دایرکتوری تنظیم شود، فایلهای داخل دایرکتوری را فقط صاحب دایرکتوری و صاحب فایل و کاربر روت میتواند تغییر اسم دهند و یا پاک کنند. این اجازهنامه به طور پیش فرض بر روی tmp/ وجود دارد. روی بعضی از سیستمهای قدیمی این اجازهنامه را میشود روی فایلهای معمولی هم تنظیم کرد.
برای تنظیم کردن suid ، sgid و sticky bit از جدول زیر استفاده میکنیم:
نوع دسترسی | عدد اختصاص داده شده |
---|---|
suid | 4000 |
sgid | 2000 |
sticky bit | 1000 |
اگر suid تنظیم شود، در قسمت صاحب (۳ کاراکتر اول از رشته ۹ کاراکتری)، به جای کاراکتر s ، x قرار میگیرد.
chmod 4777 suid ls -l suid -rwsrwxrwx 1 alieblice alieblice 7 2013-01-29 12:50 suid
اگر sgid تنظیم شود، در قسمت گروه (۳ کاراکتر دوم از رشته ۹ کاراکتری)، به جای s ، x قرار میگیرد.
chmod 2777 sgid ls -l sgid -rwxrwsrwx 1 alieblice alieblice 4 2013-01-29 12:55 sgid
اگر stiky تنظیم شود، در قسمت دیگران (۳ کاراکتر سوم از رشته ۹ کاراکتری)، به جای t ، x قرار میگیرد.
chmod 1777 test-directory ls -l test-directory drwxrwxrwt 2 alieblice alieblice 4096 2013-01-29 12:58 test-directory