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


24

例如,我想授予同事对某些目录的写权限。假设其中的子目录具有访问权限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 {} \;

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

Answers:


40

setfacl具有一个递归选项(-R),就像chmod

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

它还允许使用大写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 .

(所有报价都来自man setfaclACL-52年2月2日为Debian自带)


4
setfacl在FreeBSD 9中没有'-R'标志
Aaron C. de Bruyn 2014年

6
那么它是很好的,OP标记他们的问题为[Linux的]
umläute

错过了。;)
Aaron C. de Bruyn

这会自动应用于之后创建的新文件/文件夹吗?

在手册页中查看您的setfacl版本。该选项-X无法正常运行setfacl 2.2.49
phyatt

5

如umläute所述,setfacl -R使用大写字母“ X” 的命令是一种处理方式,例如:

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 )Process Substitution,它专用于bash。如果使用其他外壳,则可能需要创建一个临时文件。


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


@muru出于好奇,为什么不呢?
Shadur '16

整个评论是一个链接。跟随并找出答案。
muru

如果您想使用这种方法,请使用find /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
-sibaz

1
不要使用它。$(find /data -mindepth 0 -type d)不会逐行返回结果,它将缓冲整个结果。如果一行中有空格,则$i变量中的记录将不正确。
Gnought
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.