Linux
如何在目錄上遞歸設置權限(啟用 ACL)?
例如,我想授予我的同事對某個目錄的寫入權限。假設其中的子目錄具有訪問權限 775、文件 664,並且目錄中還有一些執行檔 - 775。
現在我想添加寫權限。使用 chmod,我可以嘗試類似
chmod o+w -R mydir/
但這並不酷,因為我不想讓 dir 世界可寫 - 我只想授予某些使用者訪問權限,所以我想使用 ACL。但是有沒有一種簡單的方法來設置這些權限?如我所見,我需要分別處理至少三種情況(目錄、文件、執行檔):
find -type d -exec setfacl -m u:colleague:rwx {} \; find -type f -executable -exec setfacl -m u:colleague:rwx {} \; find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;
對於這樣一個簡單的任務,似乎有很多程式碼行。有沒有更好的辦法?
setfacl
有一個遞歸選項 (-R
) 就像chmod
:-R, --recursive Apply operations to all files and directories recursively. This option cannot be mixed with `--restore'.
它還允許使用 capital-x
X
權限,這意味著:execute only if the file is a directory or already has execute permission for some user (X)
因此,執行以下操作應該有效:
setfacl -R -m u:colleague:rwX .
(所有報價均來自Debian 隨附
man setfacl
的acl-2.2.52 )
正如 umläute 所提到的,
setfacl -R
帶有大寫“X”的命令是要走的路,比如:setfacl -R -m u:colleague:rwX .
但是,對於那些需要重新應用 ACL 的人來說(例如“重新應用子目錄的權限”à la Windows)。
find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
該命令可以拆分以避免錯誤,如
setfacl: foobar: Only directories can have default ACLs
.find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/') find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')
請注意,語法
<( something )
是Process Substitution,它是特定於 bash 的。如果您使用另一個 shell,您可能需要創建一個臨時文件。