Linux

如何在目錄上遞歸設置權限(啟用 ACL)?

  • July 21, 2020

例如,我想授予我的同事對某個目錄的寫入權限。假設其中的子目錄具有訪問權限 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-xX權限,這意味著:

  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 setfaclacl-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,您可能需要創建一個臨時文件。

引用自:https://unix.stackexchange.com/questions/98007