对目录和文件设置不同的 ACL

对目录和文件设置不同的 ACL

我想设置文件共享的默认权限,以便每个人都可以访问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

谢谢

答案1

正如 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

$ 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 '{}' ';'

答案2

对于未来的读者来说,要在现有文件/文件夹中使用setfacl而不向文件添加可执行位,解决方案是@Mikel 的回答

我的 setfacl 版本允许 X 完全按照您的需要进行操作,例如:

setfacl g:mygroup:rwX

相关摘录自setfacl文档

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

答案3

据我了解,Linux ACLsetfacl -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是将 的条目( ) 与 ACL_MASK 条目 ( )mygroup进行“与”运算的结果。ACL_GROUPmygrouprwxrw-

acl(5) 手册页在“访问检查算法”下解释了计算方法。它没有解释ACL_MASK条目是如何生成的,但在实践中似乎发生了正确的事情。

相关内容