如何在目录上递归设置权限(启用 ACL)?

如何在目录上递归设置权限(启用 ACL)?

例如,我想授予我的同事对某个目录的写权限。假设其中的子目录的访问权限为 775,文件为 664,并且 775 目录中还有一些可执行文件。

现在我想添加写权限。使用 chmod,我可以尝试类似的方法

chmod o+w -R mydir/

但这并不酷,因为我不想使该目录成为世界可写的 - 我只想授予某些用户访问权限,所以我想使用 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 {} \;

对于这样一个简单的任务来说,似乎有很多代码行。有没有更好的办法?

答案1

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 .

(所有引用均来自man setfacl来自acl-2.2.52随 Debian 一起提供)

答案2

正如 umläute 所提到的,带有大写“X”的命令setfacl -R是正确的方法,例如:

setfacl -R -m u:colleague:rwX .

然而,对于那些需要递归地重新应用 ACL(即像 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 )流程替代,这是 bash 特有的。如果您使用其他 shell,您可能需要创建一个临时文件。

答案3

如果您想授予仅读取目录的递归权限,则始终使用r-x.

使用给定的 CMD :setfacl -Rm u:user_name:permission /location/abc/xyz

示例及解释: setfacl -Rm u:admin12:r-x /appl/work/load/

         Here `setfacl` : used to set permission.
               -Rm      : R for recursive and m for modify those old permission on given path. 
                u       : User which u want to add with given permission.
                admin12 : its an user , same user wants permission for a given location.
                
        /appl/work/load : Set a location where you want to give permission.


            

答案4

for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done

相关内容