介紹如何在 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