我想设置文件共享的默认权限,以便每个人都可以访问rwx
所有目录,并且所有新创建的文件都可以访问rw
。
访问此共享的每个人都属于同一组,因此无需担心。
我曾考虑通过 ACL 来实现这一点,而无需更改所有用户的 umask 等。以下是我当前的调用:
setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name
我的问题是,虽然我希望所有新创建的子目錄rwx
我只想要新创造的文件成为rw
。
有没有人有更好的方法来实现我想要的最终结果?有没有办法将目录上的 ACL 与文件分开设置,类似于chmod +x
vs. 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_GROUP
mygroup
rwx
rw-
这acl(5) 手册页在“访问检查算法”下解释了计算方法。它没有解释ACL_MASK
条目是如何生成的,但在实践中似乎发生了正确的事情。