例如,我想授予我的同事对某个目录的写权限。假设其中的子目录的访问权限为 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