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

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

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

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

答案1

如果可能的话,使用访问控制列表 (ACL)

在 Linux 下,确保您使用的文件系统支持 ACL(大多数 UNIX 文件系统都支持)。您可能需要更改挂载选项以启用 ACL:对于 ext2/ext3/ext4,从 2.6.39 开始,内核默认启用 ACL。在较旧的内核上,您可能需要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是022,这意味着文件可以拥有除按组和其他写入之外的所有权限。将其更改为 002,表示仅禁止其他权限写入。您通常会将该设置放入您的~/.profile

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

答案2

您可以通过创建目录来控制分配的权限位umask和组设置gidGROUPNAME

$ 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它不会自动传播到现有目录。在 OS X 上,随后在 a 下创建目录设置gid目录将是设置gid,虽然后者会在组里GROUPNAME。在大多数 Linux 发行版上,设置gidbit 将传播到新的子目录。

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

如果您可以使用 POSIX ACL,您可以更好地控制事情;应该可以指定权限掩码和组,并让它们合理地传播。不过,对 POSIX ACL 的支持有些不同。

答案3

这个问题很适合linuxacl。由于您没有说明您的操作系统,因此我将在下文中假设使用 Linux。这是一个示例会话。

我不知道有什么真正好的acl教程,但你可以做得比“在 Fedora Core 2 (Linux Kernel 2.6.5) 中使用 ACL”,作者:Van Emery

请注意,默认值的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

foo设置为的组,并设置为 的staff组和用户的acl 。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

将用户和组的默认 aclrwx也设置为。这定义了文件和目录继承的权限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现在以用户身份创建一些文件faheemjohn.

/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

相关内容