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

dur*_*dal 16 linux permissions chmod acl file-permissions

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

访问此共享的每个人都在同一个组中,因此这不是问题。

我已经看过通过 ACL 执行此操作而不更改所有用户的 umask 等。以下是我目前的调用:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name
Run Code Online (Sandbox Code Playgroud)

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

有没有人有更好的方法来实现我想要的最终结果?有没有办法在目录上与文件分开设置 ACL,chmod +x与 vs.类似chmod +X

谢谢

Mik*_*kel 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--
Run Code Online (Sandbox Code Playgroud)

注意上面的有效烫发。(只有少数程序会要求在它创建的文件上设置执行位,例如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
Run Code Online (Sandbox Code Playgroud)

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

覆盖权限,将它们设置为文件的 rw 和目录的 rwx

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

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

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

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

$ find . -type d -exec chmod g+rwX '{}' ';'
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

setfacl g:mygroup:rwX

setfacl文档的相关摘录:

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