Subsections


1 權限

GNU 和 Unix 系統是被設置為可以多人使用同一部電腦,但亦能把某些檔案設定為私人的,或是可以使某些人不能更改某些檔案。您可以試一試去驗證。用您自己的賬號登入,即是不要使用 root。

whoami
這個指令證實您不是 root。跟著輸入以下的指令:

rm /etc/resolv.conf
您應會 被警告 Permission denied(沒有權限)。/etc/resolv.conf 是系統的一個重要的設定檔,除非您是 root,您沒有能力更改或刪除它。這樣就能防止您不慎把系統弄壞。假若那部電腦是公眾使用的(例如在辦公室�堜徆ヴ淰堙^,這樣可以防止用者刻意弄壞系統。

現在輸入 ls -l /etc/resolv.conf,

您會得到類似這樣的輸出:

-rw-r--r-- 1 root root 119 Feb 23 1997 /etc/resolv.conf

給 ls 的參數 -l 是用來引出額外的資料。右邊的資料比較簡單:檔案的大小是 119 個位元組 (bytes),檔案的最後更改日期是一九九七年二月二十三日,檔案名字是 /etc/resolv.conf。左邊的資料就比較複雜了。

首先,來個簡短的技術性解釋:-rw-r--r-- 是檔案的狀態,1 是指著這個檔案的硬性連結 (hard link)(或是一個目錄中的檔案數目),而那兩個 root 是分別指擁有這個檔案的用戶 (user) 和群組 (group)。

是的,這是有點難以理解,現在就讓我們慢慢地解釋吧。

1 檔案附屬權 (file ownership)

每一個檔案都有兩個擁有者:用戶和群組。先前的那個例子有點混淆,因為除了用戶 root 之外還有一個群組叫做 root。群組只是一些被一同容許存取系統某部份的用戶。games 群組就是一個好例子。

這是一個比較實際的例子。幻想您現在正為一所學校架設一部電腦,您可能想設置某些檔案為只可以讓老師存取,而學生是不可以的,因此您把所有的老師都放到同一個群組�堨h。跟著您便告訴系統哪些檔案是屬於群組 teachers 的成員,而其他人就不能接觸到這些檔案的。

現在就讓我們探索一下系統中的群組。首先,您可以在 shell prompt 用指令 groups,這樣會顯示您所屬於的群組。例子如下:

$ groups

username dialout cdrom floppy audio

很大機會您只是一個群組的成員,而那個群組的名稱和您的用戶名稱是一樣的。不過,root 可以加您到別的群組中。以上的例子表示那個用者是五個群組的成員。

less /etc/group
這個檔案列出您的系統中的群組。要留意的是 root 群組(root 是這個群組的唯一成員)和與您的用戶名稱一樣的那個群組。還有其它的群組如 dialout(能夠使用 modem 打出的用戶)和 floppy(能夠使用軟磁片機的用戶)。不過您的系統有可能還未設置成利用這些群組,所以,很可能現在只有 root 才能使用軟磁片機和 modem。有關這個檔案的詳情,請參閱 man group。

ls -l /home
這個命令顯示,所有用戶的目錄都是由那個用戶及他所屬的私人群組所擁有。
提示: 如果您是剛安裝 Debian 的,您可能是唯一的用戶。您可以使用 adduser 指令來增加用戶。

2 狀態 (mode)

檔案和目錄除了是被用戶及群組所擁有之外,它們還有一個狀態。狀態決定誰可以讀、寫、和執行那個檔案(如果它是一個程式)。其實還有其它的東西決定檔案的狀態,但這些是較深的課題,所以我們亦不會在此討論。

在 ls 的輸出�堙A我們可以看到檔案的狀態是:-rw-r--r--。我們會把它分成九部份來看:擁有檔案的用戶、群組、和其他用戶(others,即是系統的所有用戶,有時會稱這個為world)的讀 (read),寫 (write),及執行 (execute) 權限。

在狀態一行中,第一個「元素」是檔案種類 (file type)。這�堛� - 表示這是一個普通的檔案。如果它是 d,那麼我們就是在檢查一個目錄。還有其它的種類,因太複雜所以不會在這�婺捋﹛C詳細資料可看第 [*] 頁的第 13.2.2 節。

剩下來的九個元素是用來顯示檔案的狀態,那九個位(用戶、群組、和其他用戶的讀、寫和執行權)是由三組 rwx 來表示。

所以如果檔案所有的權限都被許可,而它又是一個普通的檔,狀態將會是類似這樣:-rwxrwxrwx。如果它是一個目錄,而所有其他用戶的權限都被釋放,但用戶和群組都被賦予所有權限,那麼狀態將會是:drwxrwx---。


表 7.1: Linux 上的權限

碼 名稱 對於檔案可做的動作 對於目錄可做的動作
r 讀取 (read) 察看檔案內容 列引目錄的內容
w 寫入 (write) 更改檔案 加減目錄�堛瑰仵�
x 執行 (execute) 執行一個指令 存取目錄內的檔案


表 7.1 形容對於檔案及目錄的讀、寫、及執行權限的意思。

目錄的狀態的意義可能有點混淆,所以這�埵酗@些例子用來闡明不同組合的效果:

r--
用戶、群組、和其他用戶如擁有這個權限,則表示他們可以列出目錄的內容,但除此之外不能做其它的事。目錄�堛瑰仵蚺ㄞ鈳Q讀取、更改、刪除、以及任何方式的處理。唯一可以做的就是讀取這個目錄,亦即是觀看它包含的內容。

rw-
在沒有執行權限的時候,寫入權限是沒有作用的,所以這個狀態和上面的那個是一樣的。

r-x
這個狀態允許列印目錄內的檔案,以及存取這些檔案,但不可以建立或刪除檔案。存取的意思是您可以觀看,更改,及執行這些檔案(如果檔案本身的權限允許您這樣做)。

--x
目錄內的檔案可以被存取,但它的內容不能被列印,所以您必須事先知道目錄中檔案的名稱(除非您料事如神,能夠猜中它們的名字)。您不能建立或刪除檔案。

rwx
您可以對目錄內的檔案做任何事,只要檔案本身的權限允許您這麼做。

目錄的寫入權限決定了您是否可以刪除目錄中的檔案,如果您有權寫入一個目錄,您亦可以把內�堛漱@個唯讀檔案刪除掉;然而您不可以刪除一個唯讀目錄中的檔案,就算您有權更改那些檔案。

亦即是說,如果您擁有一個目錄,您就一定可以刪除內�堛瑰仵蛂A就算那些檔案是屬於 root 的。

目錄的執行權限決定您是否有權存取檔案──亦因此決定檔案權限的用處。如果您擁有一個目錄的執行權限,這個目錄類檔案的權限就會變得有關係了,否則,檔案權限是什麼也沒有所謂的,因為反正您也不能存取得到那些檔案。

3 權限的練習

在這一節我們會看看一個示範怎樣使用權限的例子,以下會利用到 chmod 這個指令去改變權限的。

cd; touch myfile
這�埵陷X個有趣的技倆。第一個,是您可以用 ; 來把兩個命令放在一行上。您可以把上述的命令打成:

$ cd 

$ touch myfile 

或是:

$ cd; touch myfile
無論那種方法都能達到同樣效果。

若您還記得,用 cd 可以立即回到您自己的 home 目錄; touch 通常是用來把檔案的更新日期 (modification time) 改為現在的時間。但它有另一個有趣的特點:如果檔案不存在,touch 便會製造它。所以您是用它來製造一個作練習用的檔案。用 ls -l 來確定檔案真的已被建立,並且記住它的權限模狀態:

$ ls -l 

-rw-r--r-- 1 user user 0 Nov 18 22:04 myfile

當然,在您試的時候,時間及用戶/群組都會有別於上述的。檔案的大小是 0,因為 touch 建立的是個空的檔案。-rw-r--r-- 是 Debian 上的預設權限。

chmod u+x myfile
這個指令的意思是添加 (+) 執行 (x) 權限給擁有該檔案的用戶 (u)。用 ls -l 去看看它的效果。

chmod go-r myfile
這樣做會從擁有該檔案的群組 (g) 以及其他用戶 (others, o) 的手中奪去 (-) 讀取權限 (r)。同樣地,使用 ls -l 去驗證它的效果。

chmod ugo=rx myfile
這樣做會把用戶、群組、和其他用戶設為擁有讀取及執行的權限。這個設定是和您所輸入的一模一樣,之前的權限將不會保留。所以所有的 rx 都會被設置,而所有的 w 都會被取消。現在,任何人也不能寫入這個檔案的了。

chmod a-x myfile
a 是 ugo,或 ``all'' 的簡寫。因此,所有的 x 權限都會被奪去。

rm myfile
用這個指令來刪除檔案,但因為您沒有寫入的權限,所以 rm 會詢問以下的問題來確定您是否真的要這樣做:

rm: remove `myfile', overriding mode 0444?
您應回答 y,再按 Enter。這個是 rm 的特點,並不關乎權限的問題。能否刪除檔案取決於它所在的目錄的權限。您擁有寫入目錄的權限,但 rm 發覺您不想改那個檔案(因為您已移去了寫入權限),所以它認為您也不希望把檔案刪除,因此它就順便詢問您以確定。

但在問題�堨X現的那個 0444 究竟是什麼呢?其實權限是由一個 12 個位的二進制數字所組成,如 000100100100。044 就是這個二進制數字的八進制寫法,八進制是填寫狀態的慣用寫法。所以除了輸入 chmod ugo=r myfile 之外,您還可以鍵入 chmod 444 myfile。

John Goerzen / Ossama Othman / Debian 中文計劃