chmod مخفف عبارت Change Mode به معنای تغییر در سطح دسترسی فایلها و دایرکتوری میباشد.
همانطور که میدانیم لینوکس یک سیستم عامل چند کاربره است. در لینوکس، هر فایل یا دایرکتوری دارای یک سطح دسترسی مشخص برای هر کاربر است. یکی از علل امنیت بالای لینوکس مشخص بودن سطح دسترسی برای هر کاربر است. در زیر مفاهیم کاربر (user)، اجازه ها (permissions)، صاحب (owner) و گروه (group) را مشخص میکنیم و بعد دستور chmod را توضیح میدهیم.
کاربر: هر کسی که از کامپیوتر استفاده میکند یک کاربر نامیده میشود و دارای یک نام کاربری است که معمولا در ابتدای نصب سیستم عامل، این نام مشخص میشود و فرد، موقع ورود به سیستم با این نام وارد میشود. با استفاده از دستور whoami میتوان نام کاربری را به دست آورد.
whoami
و دستور who یا w برای دیدن کابرانی که به سیستم متصل هستند :
who
w
اجازهها Permissions(سطح دسترسی): هر کاربر برای هر فایل یا فولدر دارای سه نوع سطح دسترسی خواندن (read)، نوشتن (write) و اجرا کردن (execute) و – (Dash ) به معنای نداشتن دسترسی ( no Permission ) است. این سطوح دسترسی برای فایل و دایرکتوری کمی متفاوت است. برای فایلها، خواندن به معنای باز کردن فایل و دیدن محتویات آن است، نوشتن به معنای تغییر در محتویات فایل است و اجرا کردن هم که فقط برای فایلهای اجرایی و یا اسکریپت است، به معنای اجرا شدن آن برنامه است. برای دارکتوری ها، خواندن به معنای لیست کردن فایلهای درون آن دایرکتوری است، نوشتن به معنای ساختن یا پاک کردن فایلها درون دایرکتوری است و اجرا کردن به معنای اجازه ورود به دایرکتوری و زیر دایرکتوری است.
صاحب Owner : در حالت کلی به کاربری که فایل یا دایرکتوری را ایجاد میکند صاحب آن فایلها و دایرکتوری گفته میشود.
گروه Group: هر کاربر ممکن است به یک یا چند گروه تعلق داشته باشد. مثلا ممکن است نام کاربری majid هم به گروه majid و هم به گروه root و هم به گروه sambashare تعلق داشته باشد. در این صورت، اگر اجازههایی را برای گروه sambashare در نظر بگیریم، برای آن کاربر هم منظور میشود. همانطور که متوجه شدید، میتوان نام کاربری و نام گروه یکسانی داشت و گروه بندی برای ساده کردن اعمال دسترسی ها است که اگر بر روی یک گروه تغییری ایجاد کنیم این تغییر بر روی تمامی کاربرانی که عضو آن گروه هستند هم اعمال می شود .
نکته: هر کاربری که در هیچکدام از دو دسته ی گروه و کاربر قرار نداشته باشد، به آن دیگران (others) گفته میشود.
دستور chmod
نمای کلی دستور:
$ chmod option … mode … file
$ chmod option … octal-mode … file
مثال :
mkdir test
chmod 777 test
در مثال بالا با دستور mkdir یک دایرکتوری جدید به نام test ایجاد کردیم و با دستور chmod نوع دسترسی فایل رو به دسترسی کامل تغییر دادیم ( در ادامه بیشتر با اعداد به کار رفته آشنا می شوید )
option: پارامترهایی که برای تغییر سطح دسترسی به دستور میدهیم.
mode: نوع سطح دسترسی
octal-mode: عددی در مبنای ۸ که نوع سطح دسترسی را مشخص میکند (حالت جایگزین برای mode).
file: فایلی که میخواهیم تغییرات را روی آن انجام دهیم.
فرض کنید در پوشه home/majid/ دایرکتوری داریم به نام myFolder که حاوی محتویات زیر است:
File1.txt
File2.txt
File3.txt
File4.txt
حال با دستور cd وارد آن دایرکتوری میشویم و با دستور ls و پارامتر l- لیستی از فایلهای درون آن بدست میآوریم. (در صورت نیاز، دستورهای ls و cd مشاهده شود)
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 یعنی دایرکتوری تغییر کرد.
نماد و معانی حروفی که در اول یک خط بعد از وارد کردن دستور ls -la می بینیم به قرار زیر است :
d = دایرکتوری , Directory
- = فایل معمولی , regular file
l = نماد لینک , symbolic link
s = جا و مکان دامین یونیکس, Unix domain socket
p = نامگذاری شده توسط پایپ , named pipe
c = کاراکتر های فایل سیستم , character device file
b = مسدود شده توسط سیستم , block device file
۹ کارکتر بعدی به ترتیب اجازه خواندن (read)، نوشتن (write) و اجرا کردن (execute) برای به ترتیب صاحب (owner)، گروه (group) و دیگران (others) است. مثلا در خروجی بالا، برای فولدر myFolder1، صاحب دارای دسترسی rwx، گروه دارای دسترسی rwx و دیگران دارای دسترسی x– هستند( در مورد دستور های Chown برای تغییر صاحب و Chgrp برای تغییر دادن گروه کاربری بعدا بحث خواهد شد )
تغییر دادن سطح دسترسی به یک فایل:
نمای کلی برای دستور chmod به صورت زیر است:
$ chmod [ugoa][+-=][rwx] FILE_NAME
کاراکترهای موجود در کروشه های اول، به ترتیب نشاندهنده کاربر (User)، گروه (Group)، دیگران (Others) و همه (All) میباشند. میتوان یک یا چند کاراکتر از کروشه اول را در کنار هم و بدون در نظر گرفتن ترتیب استفاده کرد (توضیح در مثال پایین). از کاراکترهای + , – و = موجود در کروشه دوم تنها میتوان یکی را استفاده کرد که نشاندهنده افزودن یا کاستن سطح دسترسی مورد نظر است. از کاراکترهای r و w و x موجود در کروشه سوم هم میتوان یک یا چند عدد را بکار برد که نشان دهنده نوع دسترسی است.
+ به معنای اضافه کردن دسترسی , add this permission
- به معنای پاک کردن دسترسی , remove this permission
= به معنای اختصاص دادن دسترسی ذکر شده , set exactly this permission
مثال:
ls -l
drwxrwxr-x 2 majid majid 4096 Jan 27 08:07 myFolder1
chmod ug-w myFolder1
ls -l
dr-xr-xr-x 2 majid majid 4096 Jan 27 08:07 myFolder1
در این مثال، دسترسی نوشتن در فولدر myFolder1 را از کاربر و گروه گرفتیم. (دقت کنید که بین ug و w و – فاصله ای وجود ندارد)
ls -l
-rw-rw-r– 1 majid majid 20 Jan 27 07:53 File2.txt
chmod o+wx File2.txt
ls -l
-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
حال این سه عدد را در کنار هم قرار میدهیم و از آن به جای کل عبارت قبل از اسم فایل استفاده میکنیم.
ls -l
-rw-rw-r– 1 majid majid 20 Jan 27 07:53 File2.txt
( 6 6 4 )
chmod 667 File2.txt
ls -l
-rw-rw-rwx 1 majid majid 20 Jan 27 07:53 File2.txt
( 6 6 7 )
راه راحتتر، استفاده از جدول زیر است
نوع دسترسی | عدد اختصاص داده شده |
---|---|
x | 1 |
w | 2 |
r | 4 |
حال کافیست مثلا برای تعیین سطح دسترسی rwx بنویسیم ۱+۲+۴ = ۷
پارامترهای پر استفاده ی دستور Chmod :
c- یا changes– : مثل پارامتر v- ولی تنها وقتی اعلام میکند که تغییرات حتما انجام شده باشد.
ls -l
-rw-rw-r– 1 majid majid 260 Jan 27 07:54 File3.txt
chmod -c 777 File3.txt
ls -l
mode of ‘File3.txt’ changed from 0664 (rw-rw-r–) to 0777 (rwxrwxrwx)
v- یا verbose– : کارهایی که انجام میدهد را اعلام میکند.
reference=RFILE– : از سطوح دسترسی فایل RFILE به عنوان سطوح اعمالی برای دستور استفاده میکند.
ls -l
-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/ls -l
-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
در کنار سه نوع اجازهنامه خواندن، نوشتن و اجرا کردن، سه نوع دیگر از اجازهنامه ها هستند که تاثیرشان بر روی دایرکتوریها و فایلها متفاوت است.
۱. suid
فقط بر روی فایلهای با قابلیت اجرایی تاثیر دارند. اگر بر روی یک فایل با قابلیت اجرایی تنظیم شود، وقتی آن فایل اجرا شود، آن فایل با دسترسی صاحب فایل اجرا میشود و نه با دسترسی فردی که فایل را اجرا کرده. مثلا وقتی شما با دستور passwd پسوردتان را تغییر میدهید تغییراتی را داخل فایل shaddow ایجاد میکنید و از آنجایی که ایجاد تغییر در فایل shaddow فقط برای کاربر ریشه میسر است، پس باید دستور passwd با دسترسی ریشه اجرا شود، برای همین بر روی این دستور به طور پیش فرض suid تنظیم شده.
نکته: اگر suid بر روی دستوراتی مثل vi تنظیم شود، تمام کاربران به تمام فایلهای داخل سیستم دسترسی روت خواهند داشت و یک مشکل امنیتی بزرگ به وجود میآید.
۲. sgid
اگر بر روی یک فایل با قابلیت اجرایی تنظیم شود وقتی آن فایل اجرا شود، با دسترسی گروه فایل اجرا میشود و نه با دسترسی گروه فردی که فایل را اجرا میکند. اگر بر روی دایرکتوری ها تنظیم شود هر فایل یا دایرکتوری که داخل اون فایل ساخته شود، گروه همان فایل را به خود اختصاص میدهد و گروه فردی که فایل را ساخته، نمیگیرد.
۳. 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
نوشته شده توسط «مجید کمالی»
نوشته مدیریت مجوز دسترسی فایلها با دستور chmod اولین بار در لینوکس سیزن , آموزش گنو / لینوکس پدیدار شد.