使目录中的所有新文件可供组访问


131

假设我有两个用户Alice和Bob以及一个组GROUPNAME和一个文件夹foo,两个用户都是GROUPNAME的成员(使用Linux和ext3)。

如果我将用户Alice下的文件保存为foo,则权限为:-rw-r--r-- Alice Alice。但是,是否有可能实现保存在某个子目录下的每个文件都foo具有权限-rwxrwx--- Alice GROUPNAME(即所有者Alice,组GROUPNAME)?


Answers:


91

您可以使用和控制已分配的权限位umask,并将目录setgid设置GROUPNAME

$ umask 002            # allow group write; everyone must do this
$ chgrp GROUPNAME .    # set directory group to GROUPNAME
$ chmod g+s .          # files created in directory will be in group GROUPNAME

注意,您必须对每个子目录都执行chgrp/ chmod。它不会自动传播(即setgid目录下的现有目录或后续创建的目录都不会被setgid,尽管后者将在group中GROUPNAME)。

还要注意,这umask是一个流程属性,适用于该流程及其子级创建的所有文件(这些文件会umask在其父级中继承生效fork())。用户可能需要在中进行设置~/.profile,并且可能需要注意与目录无关的需要不同权限的内容。 如果您在做不同的事情时需要不同的设置,则模块可能很有用。

如果可以使用POSIX ACL,则可以更好地控制内容。应该可以同时指定权限掩码和组,并使它们合理地传播。但是,对POSIX ACL的支持有些变化。


6
在父目录上设置setgid之后创建的子目录将自动设置setgid。
Arrowmaster

2
@Arrowmaster:也许在某些系统上,但不是全部;我在OSX上进行了测试,但它至少在非root用户中不会传播。
geekosaur,2011年

2
在Debian上(我假设大多数其他Linux发行版),setgid和组名都可以传播。
Arrowmaster

3
在OS X上,目录中的setgid位仅被忽略;新文件和目录总是被赋予其包含目录的组。
约翰·弗拉蒂斯

复制或移动到foo(使用cp和mv的文件)的文件是否也可能自动获得所需的权限(-rwxrwx--- A G)?
学生

106

尽可能使用访问控制列表(ACL)

在Linux下,请确保您使用的文件系统支持ACL(大多数Unix文件系统都支持)。您可能需要更改安装选项以启用ACL:对于ext2 / ext3 / ext4,您需要acl显式指定安装选项,因此其中的条目/etc/fstab应类似于/dev/sda1 / ext4 errors=remount-ro,acl 0 1。运行mount -o remount,acl /以激活ACL,而无需重新引导。还要安装ACL命令行工具getfaclsetfacl,通常在一个叫包中提供acl

现在,一次性设置已结束,请更改目录的ACL,以赋予组写权限,并使这些权限被新创建的文件继承。在Linux下:

setfacl -d -m group:GROUPNAME:rwx /path/to/directory
setfacl -m group:GROUPNAME:rwx /path/to/directory

如果不是ACL,请将该目录归该组所有GROUPNAME,并将其权限设置为2775或2770 :chmod g+rwxs /path/to/directory。在s这里指setgid位; 对于目录,这意味着在此目录中创建的文件将属于拥有该目录的组。

您还需要设置Alice和Bob的umask,以使其默认情况下所有文件的组均可写。大多数系统上的默认umask是022,这意味着文件可以具有除按组写和其他方式写之外的所有权限。将该值更改为002,表示仅禁止他人写许可。您通常会将该设置放入您的~/.profile

umask 002    # or 007 to have files not readable by others

6
+1-非常彻底的答案。我不知道有人可以重新安装/即时运行。很高兴知道。
boehj 2011年

1
setfacl -d命令对我不起作用,因为该目录中包含的文件具有r-掩码,该掩码会否定任何写权限。希望有所帮助。参见unix.stackexchange.com/questions/71743/…–
Ben McCann

2
@its_me问题1:我显示了mount带有该remount选项的命令,因此它不使用fstab。拥有acl两次意味着文件系统已经安装了该acl选件,并且它是无害的。顺便说一下,是最近内核中ext4 acl 的默认设置(当我编写此答案时,该补丁仍是全新的)。Q2:您可以以任何顺序运行命令。
吉尔斯2014年

1
@its_me是的,您的理解是正确的,只是您添加条目的顺序无关紧要
Gilles 2014年

8
您应该改善答案,然后使用GROUPNAME代替G,使其更清晰
knocte

24

这个问题很适合linux acl。由于您没有声明您的操作系统,因此我将假设使用Linux。这是一个示例会话。

我不知道一个非常好的acl教程,但是您可能做得比http://www.vanemery.com/Linux/ACL/linux-acl.html更糟

请注意,默认acl行为类似于本地umask。由于至少在Linux中,umask是全局应用的,所以这是我知道获得本地umask效果的唯一方法。由于某种原因,这是一个鲜为人知的功能。人们到处都在询问有关本地umask覆盖的问题,网上杂乱无章,但似乎没有人想到使用acl

另请注意,您需要挂载正在acl支持的分区,例如。

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2

会议如下:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x

将group of foo设置为staff,并将acl of group和user设置foorwx

/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x

还将用户和组的默认ACL设置rwx为。这定义了文件和目录继承自的权限foo。因此,在foo下创建的所有文件和目录将具有组权限rw

/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---

现在,foo以用户faheem和身份创建一些文件john

/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

列出文件。请注意,拥有的faheem文件和拥有的文件john都是使用组权限创建的rw

/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff  1024 May  9 01:22 .
drwxr-xr-x  4 faheem faheem 1024 May  9 01:20 ..
-rw-rw----  1 faheem faheem    0 May  9 01:20 bar
-rw-rw----  1 john   john      0 May  9 01:22 baz
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.