Answers:
您可以使用和控制已分配的权限位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的支持有些变化。
-rwxrwx--- A G
)?
尽可能使用访问控制列表(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命令行工具getfacl
和setfacl
,通常在一个叫包中提供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
GROUPNAME
代替G
,使其更清晰
这个问题很适合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设置foo
为rwx
。
/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