13.14. 所有權與權限

稍早在這個章節中,當您試著要轉換到 root 的登入目錄,您收到下列的訊息:

cd /root
bash: /root: Permission denied

那就是 Linux 之安全性特色的一個示範。 Linux 就像 UNIX 一樣是一種多使用者的系統,而檔案的權限設定是一種用來保護系統以避免惡意的竄改。

當您被權限拒絕時,一個取得存取權的方法就是您之前所學的 su 到 root。 這是因為不管誰知道 root 的密碼,就能夠擁有完全的存取權限。

不過轉換為 superuser 並不總是那麼方便或一個好主意,因為這樣會很容易因為犯錯而更改了重要的設定檔案。

所有檔案與目錄都屬於建立它們的使用者所 "擁有"。 您建立 sneakers.txt 檔案 (請看 菴 13.9.1 節) 在您的登入目錄,所以 sneakers.txt 是 "屬於" 您的。

這表示您可以指定誰能讀取、寫入甚至執行這個檔案(如果該檔案是一個應用程式的話)。

讀取、寫入以及執行是三種主要的權限設定。 因為當建立使用者的帳號時,使用者被放置在群組中,您也可以指定是否某些群組可以讀取、寫入或執行檔案。

請使用 ls 指令加上參數 -l(請看 圖形 13-11)來更仔細的看看 sneakers.txt 檔案。

這裡提供了很多的資訊。 您可以看到誰可以讀取(r)、誰可以寫入(w) 這個檔案, 以及誰建立這個檔案(sam),還有擁有者屬於哪一個群組(sam)。 還記得嗎,您所屬群組的名稱是與您的登入名稱相同的。

圖形 13-11. sneakers.txt 的權限設定

其他在群組右邊的資訊包括大小以及檔案建立的日期與時間,還有檔名。

第一列顯示出目前的權限設定; 總共有十個位置。 第一個位置代表檔案的類型。 其餘的九個位置實際上是給三個不同類型使用者的三組權限設定。

舉例來說:

-rw-rw-r--

這三組是這個檔案的擁有者、這個檔案所屬的群組以及 "其他人" (代表系統上的其他使用者)。

-    (rw-)   (rw-)   (r--) 1 sam sam 
|      |       |       | 
type  owner  group   others

用來指定檔案類型的第一個項目,會顯示下列的其中之一:

在第一個項目之後的三組設定中,您將會看到下列的其中之一:

假如您在擁有者、群組或其他人的權限設定有看到一個破折號,這表示該權限不被允許。 再看一次 sneakers.txt 檔案的第一列來指出它的權限。

ls -l sneakers.txt
-rw-rw-r--    1 sam sam     130 3月 12 23:16 sneakers.txt

這個檔案的擁有者(在此為 sam)有讀寫這個檔案的權限。 這個群組 (sam) 也有讀寫 sneakers.txt 檔案的權限。 因為它不是一個程式,所以擁有者或群組都沒有執行它的權限。

13.14.1. chmod 指令

可以使用 chmod 指令來輕易地更改權限設定。 這個例子顯示如何使用 chmod 指令來更改 sneakers.txt 檔案的權限設定。

原本的檔案看起來就像是這樣,它的初始權限設定是:

-rw-rw-r--    1 sam sam     130 3月 12 23:16 sneakers.txt

假如您是這個檔案的擁有者或您是以 root 帳號登入,您可以更改擁有者, 群組以及其他人的權限設定。

現在,擁有者與所屬群組可以讀取與寫入這個檔案。 在這個群組之外的其他人只可以讀取這個檔案 (r--)。

注意警告
 

請記得檔案的權限是一種安全的象徵。 每當您允許任何人來讀取、寫入與執行檔案,您正在增加檔案有可能被竄改、變更甚至刪除的風險。 原則上,您只應該允許讀寫權限給真正需要它們的人。

在下列的例子中,您想要允許所有人來寫入這個檔案,所以他們可以讀取、寫入並儲存它。 這表示您必須要更改檔案權限中 "其他人" 的部份。

讓我們先看一下這個檔案。 在 shell 提示符號下輸入:

ls -l sneakers.txt

前面這個指令顯示了檔案的資訊:

-rw-rw-r--    1 sam sam     130 3月 12 23:16 sneakers.txt

現在,再輸入下列的指令:

chmod o+w sneakers.txt

這個 o+w 指令告訴系統您想要給予其他人寫入 sneakers.txt 檔案的權限。 如要檢查結果,再將這個檔案的資訊列出。 此時,這個檔案應該就像這樣:

-rw-rw-rw-    1 sam sam     130 3月 12 23:16 sneakers.txt

現在,所有人都可以讀寫這個檔案了。

如要從 sneakers.txt 移除讀寫的權限,可以使用 chmod 指令來一併拿走讀取與寫入的權限。

chmod go-rw sneakers.txt

藉由輸入 go-rw,您正在告訴系統從 sneakers.txt 移除群組與其他人的讀取與寫入權限。

結果看起來會像:

-rw-------    1 sam sam     130 3月 12 23:16 sneakers.txt

當您要使用 chmod 指令來更改權限設定時,您可以將這些設定當作一種簡略的表達方式,因為您所要做的事就是記得一些符號與字母來使用 chmod 指令。

這裡是這些簡略表達方式所代表意思的清單:

身份認定

u — 擁有這個檔案的使用者(就是擁有者)

g — 該使用者所屬的群組

o — 其他人(非擁有者或擁有者所屬的群組)

a — 所有人或全部 (u, go)

權限設定

r — 讀取權限

w — 寫入權限

x — 執行權限

動作

+ — 增加權限

- — 移除權限

= — 使之成為唯一的權限

想要測試您的權限設定技術嗎? 從 sneakers.txt 移除所有人的權限。

chmod a-rwx sneakers.txt

現在,看看是否您可以使用 cat sneakers.txt 指令來讀取這個檔案,您應該可以看到以下的輸出:

cat: sneakers.txt: 拒絕不符權限的操作

移除掉包括您自己的所有權限將會成功的鎖定該檔案。 不過因為這個檔案屬於您的,您總是可以使用下列的指令將它的權限設回來:

chmod u+rw sneakers.txt

請使用 cat sneakers.txt 指令來確認您(檔案的擁有者)可以再次的讀取這個檔案。

這裡是一些可使用在 chmod 的一般設定的例子:

藉由增加 -R 參數,您可以更改整個目錄樹的權限設定。

因為您不能真正 "執行" 一個目錄(像是在執行一個應用程式一樣),當您從一個目錄新增或移除執行權限時,您是在允許(或拒絕)搜尋這個目錄的權限。

假如您沒有允許其他人在目錄 tigger 有執行的權限,誰有讀取或寫入的權限將不重要。 沒有人可以進入這個目錄除非他們知道他們想要的確切檔案名稱。

例如,輸入:

chmod a-x tigger

來移除所有人的執行權限。

當您試著要 cdtigger 目錄時, 會發生此種情況:

bash: tigger: 拒絕不符權限的操作

再來,回復您自己與所屬群組的權限:

chmod ug+x tigger

現在,假如您使用 ls -l 檢查您的工作,您將會看到只有其他人被拒絕存取 tigger 目錄。

13.14.2. 使用數字更改權限

記得 chmod 速記方法的參考嗎? 這裡有 另一種方式來更改權限,雖然一開始看起來有點複雜。

讓我們回到 sneakers.txt 原本的權限設定:

-rw-rw-r--    1 sam sam     130 3月 12 23:16 sneakers.txt

每一種權限設定都可以一個數值來代表:

當這些數值加在一起時,總和被使用來設定特定的權限。 例如,如果您想要讀取與寫入的權限,您將會有數值 6; 4(讀取)+ 2(寫入) = 6。

至於 sneakers.txt,這裡是它的數值權限設定:

-  (rw-)   (rw-)  (r--)
|       |      |
4+2+0   4+2+0  4+0+0

使用者的總和是 6,群組的總和是 6,以及其他人的總和是 4。 這個權限設定被解讀為 664

假如您想更改 sneakers.txt 的權限設定,讓您所屬群組沒有寫入的權限,但仍可以讀取這個檔案,您可以從該組號碼中減掉 2 來移除這個權限。

這個數值將成為 644。

要實作這個新的設定,請輸入:

chmod 644 sneakers.txt

現在將檔案列出來確認這個變更。 請輸入:

ls -l
sneakers.txt

輸出應該為:

-rw-r--r--    1 sam sam     130 3月 12 23:16 sneakers.txt

現在,所屬群組與其他人都沒有寫入 sneakers.txt 檔案 的權限。 如要回復所屬群組的寫入權限,增加寫入 (w) 的數值 2 到第二組的權限數值即可。

chmod 664 sneakers.txt

警告警告
 

設定權限為 666 將允許所有人讀寫一個檔案或目錄。 設定權限為 777 將給予所有人讀寫以及執行的權限。 這些權限設定將允許竄改一些重要檔案,所以大體上來說,使用這些設定並不是個好主意。

這裡有一些一般的設定, 數值以及它們的含意:

這裡有一些目錄的一般設定: