--- title: حق دسترسی فایل‌ها در لینوکس به زبان ساده tags: لینوکس فایل حق دسترسی category: راهنما uuid: 4e824eb2-91bf-43ce-8efc-b4f007026f72 --- بارها برام پیش اومده که موقع تغییر فایل‌های لینوکس به خاطر مجوز اونها به مشکل خوردم. تصمیم گرفتم یکبار با دقت این مجوزها رو بخونم و به زبان ساده در وبلاگم بنویسم. البته این راهنما قرار نیست کامل باشه و بیشتر یک یادداشته برای مراجعات بعدی خودم. اگر در یک ترمینال دستور `ls -l` یا `ll` رو تایپ کنیم چیزی شبیه به این می‌بینیم: ~~~bash mehdix@spielplatz:~/Desktop/perm$ ls -l total 4 drwxrwxr-x 2 mehdix mehdix 4096 Jan 8 09:38 dir1 -rw-rw-r-- 1 mehdix mehdix 0 Jan 8 09:38 file1 ~~~ حق دسترسی و مالکیت دو موضوع تقریبا مستقل از هم هستند. ستون اول خروجی دستور بالا حق دسترسی روی فایل و پوشه موجود رو نشون می‌ده ولی ستون‌های سوم و چهارم حق مالکیت بر روی فایل‌ها رو نشون می‌ده. لازمه بگم که پوشه هم یک جور فایل است با این تفاوت که آدرس فایل‌های دیگر رو درون خودش نگه می‌داره (مراجعه کنید به `inode`). در ادامه هر دو رو شرح می‌دیم. ## مالکیت وقتی یک فایل یا پوشه رو با دستورات و اپراتورهای مختلف از جمله `mkdir` (بخوانید make directory) و `touch` و `echo` و `<` و `<<` (این دو تا رو نمی‌دونم چطور بخونیم!) می‌سازیم مالکیت فایل تولیدی هم به ما داده می‌شه. در مثال بالا ستون سوم مالک رو نشون می‌ده و ستون چهارم هم گروه کاربری رو. معنی مالک در لینوکس مثل معنی اون در دنیای واقعی است. یعنی مالک تصمیم می‌گیره چه کسی به فایل اون بتونه «نگاه» کنه یا «دست بزنه». می‌تونید تصور کنید که پدر مالک ماشینه و اون تصمیم می‌گیره که اجازه بده که فرزندش به ماشین فقط نگاه کنه یا پشت فرمون هم بشینه. نکته مهم اینجا اینه که مالک یک فایل تصمیم می‌گیره که **حق دسترسی‌های**‌ اون فایل چی باشه. جالبه بدونید که مالک می‌تونه حق دسترسی خواندن و نوشتن و اجرا کردن خودش رو هم روی فایل محدود کنه اما از جایی که مالکیت فایل رو در اختیار داره می‌تونه دوباره اون رو سر جاش برگردونه. پس یادمون می‌مونه که حق مالکیت جدا از حق دسترسی است. ## گروه کاربری هر فایلی حتما یک مالک داره که حق دسترسی‌های اون رو تعیین می‌کنه اما علاوه بر این هر فایلی به یک گروه هم تعلق داره. یک گروه نماینده کاربرانی است که حقوقی متفاوت از کاربر عادی در دسترسی به فایل‌ها دارند. یعنی بواسطه گروهشون به فایل‌هایی دسترسی داشته باشند که کاربرشون به تنهایی نداره. یک کاربر می‌تونه در بیش از یک گروه عضو باشه اما یک فایل فقط می‌تونه متعلق به یک گروه باشه. در مثال بالا هم ستون چهارم گروه کاربری رو نشون می‌ده. روی کامپیوتر اوبونتوی من که یک کاربر بیشتر نداره (البته به استثنای کاربر *root*) کاربر و گروه کاربری من یکیه. هر کاربر حتما باید عضو یک گروه باشه بنابراین به طور پیشفرض یک گروه بنام خود کاربر روی سیستم موقع نصب ساخته شده. گروه کاربری وقتی به درد می‌خوره که با بیش از یک کاربر سر و کار داشته باشیم. مثلا بخوایم به همه کاربرهایی که اعتماد داریم اجازه خواندن و نوشتن بدیم و به سایر کاربرهای سیستم فقط اجازه خواندن بدیم. در این صورت می‌تونیم گروهی که کاربران مورد اعتماد ما عضوش هستند رو به عنوان گروه فایل تنظیم کنیم. ### تغییر مالک و گروه کاربری فایل‌ها با chown هر کاربر می‌تونه حقوق دسترسی روی یک فایل رو که در مالکیت اوست تغییر بده اما نمی‌تونه مالکیت فایل رو تغییر بده. این کار باید توسط کاربر *root* انجام بشه. در ضمن وقتی ما از دستور `root` استفاده می‌کنیم (در سیستم‌های مشابه دبیان) داریم با دسترس کاربر روت تغییرات رو انجام می‌دیم. هرچند یک کاربر می‌تونه گروه کاربری یک فایل رو به گروهی جدید تغییر بده به شرط اینکه خودش عضو گروه جدید باشه. به عبارت دیگه یک کاربر می‌تونه گروه یک فایل رو بین گروه‌هایی که خودش عضو اونهاست دست به دست کنه. دستور اصلی برای تغییر مالکیت فایل‌ها `chown` است (بخوانید change owner) به این ترتیب: ~~~bash chown username:groupname file1 file2 [or directory] ~~~ در دستور بالا *username* نام کاربری است که می‌خواهیم فایل‌ها به اون تعلق داشته باشند و نیز *groupname* نام گروهی است که می‌خواهیم فایل‌ها به آن تعلق داشته باشند. این دستور رو به دو شیوه دیگر هم می‌شه اجرا کرد. فقط برای تغییر مالک فایل به شکل زیر: ~~~bash chown username file1 file2 [or directory] ~~~ و تنها برای تغییر گروه فایل به این شکل (دو نقطه فراموش نشود): ~~~bash chown :groupname file1 file2 [or directory] ~~~ برای تغییر گروه دستور `chgrp` را هم می‌توان بکار برد (بخوانید change group): ~~~bash chgrp groupname file1 file2 [or directory] ~~~ با بکارگیری فلگ *-R* تغییرات به همه زیرشاخه‌ها هم اعمال خواهد شد: ~~~bash chown -R username:groupname directory ~~~ ### حق دسترسی‌ برای فایل‌ها برای هر فایل می‌شه سه نوع حق‌دسترسی تعریف کرد: حق‌نوشتن و حق خواندن و حق اجرا کردن فایل. * **حق خواندن** یعنی دیدن محتوای فایل و استفاده از دستوراتی مانند `less` و `cat` و غیره. حق خواندن با **r** نشان داده می‌شود. * **حق نوشتن** یعنی تغییر محتویات فایل. فوروارد کردن خروجی یک دستور به یک فایل و اضافه کردن به فایل و مانند اینها. حق خواندن با **w** نشان داده می‌شود. * **حق اجرای فایل** اگر ما روی یک فایل حق اجرا داشته باشیم می‌توانیم از سیستم عامل بخواهیم که آن فایل را مثل یک برنامه برای ما اجرا کند. اگر فایل باینری باشد حق اجرا کفایت می‌کند اما اگر فایل اسکریپت باشد از جایی که باید یک برنامه دیگر آنرا بخواند و اجرا کند علاوه بر حق اجرا حق خواندن نیز لازم است. حق خواندن با **x** نشان داده می‌شود. ### حق دسترسی برای پوشه‌ها برای هر پوشه هم می‌شود سه نوع حق دسترسی تعریف کرد. خواندن و نوشتن و ‫**جستجو**. این معانی با قبلی‌ها تفاوت دارند. * **حق خواندن** به معنای دیدن لیست فایل‌های درون یک پوشه است با بکارگیری دستوری مانند `ls` (بخوانید list ). هرچند این به معنی خواندن محتوای فایل‌های داخل آن نیست. * **حق نوشتن** به معنی امکان افزودن‌ فایل‌های جدید به پوشه و همچنین تغییر نام و انتقال فایل‌های موجود است، برای مثال با دستور `mv`. * **حق اجرا روی یک پوشه** به معنی اینست که پوشه قابل جستجو است و می‌توان نام آنرا برای دسترسی به یک فایل دارای حق اجرا بکار برد. ### تغییر دسترسی‌ها با chmod یک کاربر می‌تونه حق خواندن و نوشتن و اجرای فایل‌هایی که تحت مالکیت خودش قرار دارند رو تغییر بده. همونطور که در بالا گفتیم rwx حرف اول مجوزهایی هستند که برای هر فایل بکار می‌ره. برای هر فایل سه دست حق دسترسی تعریف شده، هر دست شامل مجوز خواندن و نوشتن و اجرا است. یک دست برای مالک و یک دست برای گروه و یک دست برای سایر کاربران. در مجموع نه بیت برای اینکار بکار رفته که هر سه بیت یک دست حق دسترسی رو نشون می‌ده. هر بیت اگر ست شده باش (یعنی مقدر ۱ بهش داده شده باشه) بسته به اینکه بیت خواندن یا نوشتن یا اجرا باشه با r و w و x نشون داده خواهد شد. حالا با مراجعه دوباره به لیستی که اول نوشته داشتیم اینها رو مرور می‌کنیم: ~~~bash mehdix@spielplatz:~/Desktop/perm$ ls -l total 4 drwxrwxr-x 2 mehdix mehdix 4096 Jan 8 09:38 dir1 -rw-rw-r-- 1 mehdix mehdix 0 Jan 8 09:38 file1 ~~~ در مثال بالا خط‌های تیره در ستون اول نماینده بیت‌هایی هستند که ست نشده‌اند (مقدارشان صفر است). به ترتیب از چپ به راست اولین بیت اگر d باشد یعنی یک پوشه است اگر l باشد یعنی لینک سمبلیک است و اگر - باشد یعنی فایل معمولی است. نه سه تای بعدی مجوزهای مالک سه تای دوم مجوزهای گروه و سه تای سوم مجوزهای سایر کاربران هستند. برای این منظور از دستور `chmod` ‏‎(بخوانید change mode) استفاده می‌کنیم: ~~~bash chmod [references][operator][modes] file1 ... ~~~ در دستور بالا `references` برای انتخاب سِت مورد نظر است، مالک و/یا گروه و/یا سایر کاربران. جدول زیر نشاندهنده حروفی است که به این منظور بکار می‌رود: |رفرنس | کلاس | شرح | |-------|----------------|------| | u | user | مالک فایل | | g | group | کاربرانی که عضو گروه فایل هستند| | o | other | کاربرانی که عضو گروه فایل نیستند| | a | all | همه موارد بالا | در ادامه با مثال کاربرد این حروف را می‌بینیم. اوپراتورها هم یا + یا - یا = هستند: * **به علاوه +** به معنی افزودن یک ‫*مود* به رفرنس‌های نامبرده است * **منها -** به معنی حذف یک *مود* از رفرنس‌های نامبرده است * **مساوی =** به معنی اعمال یک *مود* به همه رفرنس‌هاست **مودها** یا حالت‌ها هم همان حق خواندن و نوشتن و اجرا هستند که البته سه مود دیگر بنام‌های X (با حرف بزرگ) و s و t هم داریم که فعلا به آنها نمی‌پردازیم. حالا چند مثال. فایل یک از مثال بالا را تغییر می‌دهیم: ~~~bash chmod ug+rw file1 ~~~ یعنی به کاربر مالک و گروه مالک حق خواندن و نوشتن را اضافه کن و این شد نتیجه: ~~~bash -rw-rw-r-- 1 mehdix mehdix 0 Jan 8 10:20 file1 ~~~ حالا همون حقوقی رو که خودمون دادیم پس می‌گیریم :) به این شکل: ~~~bash chmod ug-rw file1 ~~~ و این هم نتیجه: ~~~bash -------r-- 1 mehdix mehdix 0 Jan 8 10:20 file1 ~~~ یا مثلا گرفتن و دادن همه مجوزها به همه کاربران: ~~~bash chmod a+rw file1 chmod a-rw file1 ~~~ یا مثلا دادن **تنها** امکان خواندن به سایر کاربران: ~~~bash chmod o=r file1 ~~~ دقت کنید که بکارگیری = باعث از بین رفتن مجوزهای قبلی می‌شه در حالی که + و - مجوزها رو اضافه و حذف می‌کنند و کاری به بقیه ندارند. این‌ها در حقیقت همون عملیات and و or و mask کردن بیت‌ها در کامپیوتره. نوشتن این یادداشت باعث شد خودم بهتر این موارد رو به خاطر بسپرم. موارد بیشتری هم هست که بهرحال فهم این نکات اولیه به یادگیری بقیه هم کمک می‌کنه. منابعی هم که بکار گرفتم در انتهای مطلب[^1][^2][^3][^4] هست. [^1]: ‏[linux-file-permission-concepts](http://www.rackspace.com/knowledge_center/article/linux-file-permission-concepts) [^2]: ‏[Unix Modes](https://en.wikipedia.org/wiki/Modes_(Unix)) [^3]: ‏[Permissions](http://www.grymoire.com/Unix/Permissions.html#toc-uh-0) [^4]: ‏[Stackexchange Question](http://unix.stackexchange.com/a/140944/87940)