介紹如何在 Linux 系統上以 chmod 指令設定檔案或目錄的讀取、寫入與執行權限。
基本檔案權限
在 UNIX/Linux 系統中,檔案與目錄可以根據不同的使用者或群組授予不同的權限,我們可以使用 ls 指令搭配 -l 參數查看檔案的權限:
# 查看 /var/log/syslog 檔案的詳細資訊 ls -l /var/log/syslog
-rw-r----- 1 syslog adm 36996 Dec 18 19:35 /var/log/syslog
在這裡的 ls 輸出中,最開頭 -rw-r----- 的後面九個字元代表檔案的權限,閱讀時是三個一組,由左至右分別代表「擁有者」、「群組」、「其他使用者」的權限。
而在這九個字元中,會以下面這些符號表示各種權限:
| 符號 | 數值 | 權限 |
|---|---|---|
r |
4 |
可讀取(read) |
w |
2 |
可寫入(write) |
x |
1 |
可執行(execute) |
- |
0 |
沒有授權 |
以 /var/log/syslog 這個檔案來說,擁有者(syslog)的權限是 rw- 就代表可以讀取與寫入,群組(adm)的權限是 r-- 就代表只能讀取,而其他使用者的權限是 --- 就代表完全沒有任何權限。
讀取、寫入與執行的權限各有對應的數值,我們可以使用這三種權限的數值總和來表示這三種權限,例如 -rw-r----- 若要改以數值表示,計算方式如下:
| 角色 | 符號表示 | 數值表示 |
| 擁有者 | rw- |
4 + 2 + 0 = 6 |
| 群組 | r-- |
4 + 0 + 0 = 4 |
| 其他使用者 | --- |
0 + 0 + 0 = 0 |
所以 -rw-r----- 改以數值表示的話就可以寫成 640,這在後面的 chmod 指令會使用到。
chmod 設定檔案權限(數值方式)
chmod 指令可以用來更改檔案的權限設定,使用此指令在指定擁有者、群組與其他使用者的權限時,可以用數值的方式來表示:
# 設定檔案權限為 644 chmod 644 myfile.txt
設定好新的權限之後,可以用 ls 來檢查:
# 查看 myfile.txt 檔案的詳細資訊 ls -l myfile.txt
-rw-r--r-- 1 ubuntu ubuntu 679 Dec 18 21:55 myfile.txt
這樣的權限就代表所有人都可以讀取此檔案,但是只有擁有者可以寫入。
chmod 設定檔案權限(符號方式)
除了以數值的方式表示權限之外,亦可使用權限符號的表示方式,這種表示方式通常會由「角色」、「設定」、「權限」三個部分組成:
| 角色 | 設定 | 權限 |
|---|---|---|
u(擁有者)g(群組)o(其他使用者)a(所有角色) |
+(增加)-(刪除)=(設定為) |
r(讀取)w(寫入)x(執行) |
以下是一些簡單的使用範例。
設定檔案的擁有者權限為可以讀取與寫入(rw-):
# 設定擁有者權限為 rw-
chmod u=rw myfile.txt
只刪除群組的寫入權限,其他的各種權限都維持不變:
# 移除群組寫入權限(其餘權限維持不變)
chmod g-w myfile.txt
增加所有角色(擁有者、群組、其他使用者)的寫入權限,其他的各種權限都維持不變:
# 增加所有角色的寫入權限(其餘權限維持不變)
chmod a+w myfile.txt
如果沒有指定角色,預設會套用至所有角色(也就是 a),所以上面的指令亦可寫成這樣:
# 增加所有角色的寫入權限(其餘權限維持不變)
chmod +w myfile.txt
也可以一次設定多種權限的組合:
# 設定多種權限組合
chmod u=rwx,go=rx myfile.txt
目錄權限
Linux 的目錄權限設定方式跟檔案一樣,只不過目錄的各種權限意義跟檔案不同:
| 類型 | 讀取權限 r |
寫入權限 w |
執行權限 x |
|---|---|---|---|
| 檔案 | 可讀取檔案內容 | 可修改檔案內容 | 可執行檔案 |
| 目錄 | 可讀取目錄內的檔案名稱 | 可修改目錄內的檔案名稱 | 可以 cd 進入目錄內 |
以下是各種目錄的權限設定組合所產生的效果:
| 目錄權限 | 新增或刪除檔案、改檔名 | ls 列出檔名 |
cd 進入目錄 |
|---|---|---|---|
rwx |
可以 | 可以 | 可以 |
r-x |
不可以 | 可以 | 可以 |
--x |
不可以 | 不可以 | 可以 |
若要對目錄之下的檔案進行任何操作,目錄至少要有執行權限 x,但是如果沒有目錄的讀取權限 r,就不能用 ls 查看目錄內的檔案,會非常不方便,所以在授權使用目錄時,權限至少會包含讀取與執行(r-x)兩種。
# 設定目錄權限為 755 chmod 755 myfolder
--x 的情況下,若事先知道目錄內的檔案路徑,還是可以對檔案進行操作,就好像沒開燈,摸黑操作的意思。遞迴設定目錄與所有檔案權限
如果要用 chmod 指令設定指定目錄之下所有子目錄與檔案的權限,可以使用 -R 參數:
# 遞迴設定目錄、子目錄與所有檔案權限(加入讀取與執行權限) chmod -R +rx /path/folder
在使用 -R 的時候通常會遇到一個小問題,對於普通的檔案來說通常不會設定執行權限,但是對於正常目錄來說執行權限卻是必要的,若用 -R 參數統一開啟執行權限,會讓所有檔案都設定了多餘的執行權限,這時候可以改用大寫的 X 來設定執行權限,它只會加入目錄的執行權限,不更動檔案的執行權限(保留原有的檔案執行權限,若原來沒有就維持沒有):
# 加入檔案與目錄的讀取權限,加入目錄的執行權限,不更動檔案的執行權限 chmod -R +rX /path/folder


