3.3.4 簡介檔案的權限

Un*x 系統是為了多人使用而設計的,為了要讓大家在同一個系統上工作而不互相干擾,所以每個使用者都要在系統上有一個帳號才能登入使用系統,而且有『群組』(group)、『權限』(permission)的設計,每個帳號都可以隸屬於一個或一個以上的群組,每個檔案對不同帳號或群組都有不同的讀、寫與執行權利,一個好的 Linux 系統裡面的權限劃分非常清楚,以使不同使用者之間的工作不會相互干擾,使用者也可以利用權限對自己的文件作保護的動作,限制別人對自己檔案的讀與寫。

檔案 file.list 的權限

 

使用者

群組

他人

符號

rw-

rw-

r--

二進位

110

110

100

八進位

6

6

4


Linux 系統上的每個檔案都有檔案擁有人、檔案隸屬的群組,檔案的權限設定等等性質,這些資訊可以用 ls -l 來獲得,例如上面的例子:

[cle@h2 cle]$ ls -l
total 1
-rw-rw-r-- 1 cle cle 10 May 12 10:00 file.list
[cle@h2 cle]$

"ls -l" 顯示的資訊裡面,第一欄就是檔案的存取權限,第三欄是檔案擁有人的帳號,第四欄是檔案群組的帳號,接著是檔案大小,以 byte 為單位,再來是這個檔案最後被更動過的時間,最後則是檔名。

第一個欄位的這些字元,乍看之下有點奇怪,其實這些字元表示了這個檔案的種類與存取權限 (access permissions),這裡總共有 10 個欄位,每個欄位用一個英文字元來代表,第一個欄位是檔案的種類,可能的值有:

-    一般常規檔案
d    目錄
l    符號連結 (symbolic link)
s    socket
b    區塊裝置 (block device)
c    字元裝置 (character device)

所以上面例子裡面的檔案 "file.list" 是一個一般檔案。

接下來的九個欄位代表這個檔案的存取權限,'r' 表示可讀,'w' 表示可寫,'x' 表示可執行,九個欄位裡面前三個表示檔案擁有人的權限,中間三個是屬於這個檔案同一群組裡的使用者所擁有的權限,最後三個是其他人的權限,以上面這個 "file.list" 為例子,"rw-rw-r-" 可以拆成使用者 -> "rw-",群組 -> "rw-",他人 -> "r",所以使用者 (就是 cle) 可以讀、寫這個檔案,不能執行,同群組的人 (cle 群組) 可以讀、寫這個檔案,不能執行,其他人就只能讀了。

檔案的權限還常常用三個八進位的數目字來表示,分別把擁有人、群組、他人的權限用二進位來表示,有這個權限就是 1,沒有就是 0,如 "rw-" 就是 "110",如此可以得到三個數字,每個數字最大是 2^3,所以是八進位的,再以 file.list 為例,"rw-" -> "110" ,二進位的 110 等於 6,"r-" -> "100" -> 4,所以 file.list 檔案權限就是 664。

底下便是對這個檔案權限推算方法做一個總結:

只要是檔案的擁有人就可以利用 "chmod" 指令來改變檔案的權限:

chmod MODE FILE...    改變檔案的權限

這個指令可以用兩種方式來指定要賦予檔案的權限 (MODE),一種是直接給定八進位的檔案權限,例如:

[cle@h2 cle]$ ls -l
total 1
-rw-rw-r-- 1 cle cle 10 May 12 10:00 file.list
[cle@h2 cle]$ chmod 777 file.list
[cle@h2 cle]$ ls -l
total 1
-rwxrwxrwx 1 cle cle 10 May 12 10:00 file.list
[cle@h2 cle]$ chmod 644 file.list
[cle@h2 cle]$ ls -l
total 1
-rw-r--r-- 1 cle cle 10 May 12 10:00 file.list
[cle@h2 cle]$

此外,也可以用代碼搭配來更改檔案的權限,代碼的形式類似於 "a+x",第一欄可以是 ugoa 四個字母的組合,用來指定影響的範圍,其意義如下:

u        檔案的擁有人 (user)
g        檔案的群組 (group)
o        他人 (others)
a        所有人 (all)

第二欄可以是 +-= 其中之一,意義如下:

+        增加後面的權限
-        減去後面的權限
=        設定成後面的權限

第三欄用來指定權限,可以是 rwx 任意的組合。

例如 "chmod a+x" 就可以把所有的使用者對這個檔案的執行權限打開,檔案可被任何人執行:

[cle@h2 cle]$ ls -l
total 1
-rw-r--r-- 1 cle cle 10 May 12 10:00 file.list
[cle@h2 cle]$ chmod a+x file.list
[cle@h2 cle]$ ls -l
total 1
-rwxr-xr-x 1 cle cle 10 May 12 10:00 file.list
[cle@h2 cle]$

第一欄跟第三欄都不只限用一個字元:

[cle@h2 cle]$ ls -l
total 1
-rwxr-xr-x 1 cle    cle    10 May 12 10:00 file.list
[cle@h2 cle]$ chmod go-rwx file.list
[cle@h2 cle]$ ls -l
total 1
-rwx------ 1 cle    cle    10 May 12 10:00 file.list
[cle@h2 cle]$

以上簡單介紹了檔案權限的讀法跟改變檔案權限的指令 "chmod",其實這邊介紹得非常粗略。Un*x 系統發展了幾十年了,這些日子裡面為了系統的安全性與群組分工合作的需求,已經發展出了一套十分綿密複雜的權限設定系統,身為一個 Linux 系統的管理者,一定要能夠掌握好系統的權限設定、善用系統的權限設定,如 SUID、SGID 以及目錄的權限設定,筆者在這邊都沒有提及,有賴讀者自行再去學習了。[platin1]