在目录和文件上设置不同的ACL


15

我想为文件共享设置默认权限,以便每个人都可以访问rwx所有目录,并且所有新创建的文件均为rw

每个访问此共享的人都在同一个组中,因此不必担心。

我已经看过通过ACL执行此操作,而没有更改所有用户的umask等。这是我当前的调用:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

我的问题是,虽然我希望所有新创建的子目录都是rwx,但是我只希望新创建的文件rw

有谁有更好的方法来达到我想要的最终结果?是否有某种方法可以在目录中将ACL与文件分开设置,类似于chmod +xvs. chmod +X

谢谢

Answers:


12

正如Gilles指出的那样,setfacl默认权限指定了最大权限,基本上替代了umask。因此,rw除非创建文件的应用程序特别要求其可执行,否则将新创建文件。

$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--

$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x                         #effective:r--
group:mygroup:rwx                  #effective:rw-
mask::rw-
other::r--

注意上面的有效烫发。(只有少数程序会要求在其创建的文件上设置执行位,例如,gcc对于可执行文件以及cp要复制的文件是否可执行。)

还是您的意思是第一个setfacl命令以您想要的方式工作,而第二个却没有?换句话说,您要修复旧文件的权限,确保目录是可遍历的,而不给其他常规文件执行权限?

我的版本setfacl允许X完全按照您的意愿进行,例如:

setfacl g:mygroup:rwX

$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513    4 drwxr-xr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-r--r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxr-xr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rwxr--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rw-r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir

如果您的版本setfacl不支持该功能,为什么不使用find

覆盖权限,将其设置为rw用于文件,rwx用于dirs

$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)

根据现有的组权限设置mygroup ACL权限

$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)

您可能需要检查组掩码是否提供有效的权限。如果没有,您也必须运行此命令:

$ find . -type d -exec chmod g+rwX '{}' ';'

4

对于将来的读者,要setfacl在现有文件/文件夹上使用而不向文件中添加可执行位,解决方案是@Mikel的答案的这一部分:

我的setfacl版本允许X完全符合您的要求,例如:

setfacl g:mygroup:rwX

setfacl文档相关摘录:

perms字段是指示权限的字符的组合:读(r),写(w),执行(x),仅当文件是目录或已具有某些用户的执行权限(X)时执行


2

据我了解Linux ACL,setfacl -Rdm g:mygroup:rwx share_name它确实可以满足您的需求。实验:

umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec

然后以组中的其他用户身份mygroup

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

这是怎么回事?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

有效的ACL mygroup是AND'ing的所述的结果ACL_GROUP为条目mygrouprwx与ACL_MASK条目)( rw-)。

ACL(5)手册页解释下“访问检查算法”计算此。它没有说明ACL_MASK条目是如何生成的,但实际上似乎发生了正确的事情。

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.