介紹如何在 Linux 系統上使用 setfacl
與 getfacl
更改與查詢檔案 ACL 細部權限設定。
若要查看指定檔案或目錄的 ACL 權限設定,可以使用 getfacl
指令:
# 查看檔案 ACL 權限
getfacl myfile.txt
# file: myfile.txt # owner: ubuntu # group: ubuntu user::rw- group::rw- other::r--
setfacl
在設定檔案或目錄的 ACL 權限時,可以透過以下的權限格式來指定 ACL 權限。
語法 | 說明 | 範例 |
---|---|---|
u:使用者:權限 |
使用者權限 | u:myuser:rx |
user:使用者:權限 |
使用者權限(同上) | user:myuser:rx |
g:群組:權限 |
群組權限 | g:mygroup:rx |
group:群組:權限 |
群組權限(同上) | group:mygroup:rx |
o:權限 |
其他使用者權限 | o:rx |
other:權限 |
其他使用者權限(同上) | other:rx |
m:權限 |
有效權限 | m:rx |
mask:權限 |
有效權限(同上) | mask:rx |
若要修改檔案的 ACL 權限,可以使用 setfacl
搭配 -m
或 --modify
參數,並指定 ACL 權限。例如授予 myuser
使用者讀取與執行(rx
)權限:
# 授予 myuser 使用者 rx 權限 setfacl -m u:myuser:rx myfile.txt
授予 mygroup
群組讀取與執行(rx
)權限:
# 授予 mygroup 群組 rx 權限 setfacl -m g:mygroup:rx myfile.txt
我們也可以透過 ACL 來禁止特定使用者存取檔案:
# 禁止 myuser 使用者存取 setfacl -m u:myuser:- myfile.txt
若要移除指定的 ACL 權限,可以使用 -x
參數,移除 ACL 權限時可不需要指定權限內容:
# 移除 myuser 使用者 ACL 權限 setfacl -x u:myuser myfile.txt # 移除 mygroup 群組 ACL 權限 setfacl -x g:mygroup myfile.txt
如果想要清除指定檔案的所有 ACL 設定,可以使用 -b
或 --remove-all
參數:
# 移除檔案所有 ACL 設定 setfacl -b myfile.txt
若要清除指定目錄中所有檔案或子目錄的任何 ACL 設定,可以再加上 -R
或 --recursive
參數,以遞迴的方式移除 ACL 設定:
# 遞迴移除目錄下所有檔案所有 ACL 設定 setfacl -Rb myfolder
setfacl
可以搭配遮罩(mask)來設定 ACL 的有效權限範圍,任何人的 ACL 權限都不能超過此範圍,超過的部分都無效。
舉例來說,假設既有的檔案已經授予 myuser
使用者 rx
權限:
# 授予 myuser 使用者 rx 權限 setfacl -m u:myuser:rx myfile.txt
如果希望指定檔案對任何人都只開放讀取的權限,就可以這樣設定遮罩:
# 設定遮罩,只開放讀取權限 setfacl -m m:r myfile.txt
設定遮罩之後,超出遮罩範圍的權限就會失效:
# 查看檔案 ACL 權限
getfacl myfile.txt
# file: myfile.txt # owner: ubuntu # group: ubuntu user::rw- user:myuser:r-x #effective:r-- group::rw- #effective:r-- mask::r-- other::r--
當遮罩設定之後,會顯示每個 ACL 權限設定的有效權限,這裡的 effective:r--
就代表有效的權限只有讀取而已。
如果希望在特定目錄之下,所有新建立的檔案都可以自動繼承特定的 ACL 權限設定,可以在目錄上加上預設的 ACL 權限,預設 ACL 權限的表示法就是在一般 ACL 權限之前加上 d:
或 default:
:
# 設定目錄預設 ACL 權限 setfacl -m d:u:myuser1:rx myfolder setfacl -m d:u:myuser2:rx myfolder
設定好預設 ACL 權限之後,在目錄中建立的新檔案就會自動繼承這些 ACL 權限:
# 建立新檔案 touch myfolder/myfile.txt # 查看檔案 ACL 權限 getfacl myfolder/myfile.txt
# file: myfolder/myfile.txt # owner: ubuntu # group: ubuntu user::rw- user:myuser1:r-x #effective:r-- user:myuser2:r-x #effective:r-- group::rwx #effective:rw- mask::rw- other::r--
若要清除預設的 ACL 權限設定,可以使用 -k
或 --remove-default
參數:
# 移除預設 ACL 權限設定 setfacl -k myfolder
若要將 file1
的 ACL 權限設定複製到 file2
,可以使用以下指令:
# 複製 ACL 權限設定 getfacl file1 | setfacl --set-file=- file2
若要將 myfolder
目前的 ACL 權限設定,直接設定為預設的 ACL 權限,讓以後新增的檔案自動繼承,可以執行以下指令:
# 將目前 ACL 權限設定為預設 ACL 權限 getfacl --access myfolder | setfacl -d -M- myfolder