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

stu*_*ent 152 acl permissions umask group

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

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

Gil*_*il' 129

如果可能,请使用访问控制列表 (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
Run Code Online (Sandbox Code Playgroud)

如果 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
Run Code Online (Sandbox Code Playgroud)

  • 您应该改进答案然后使用`GROUPNAME`而不是`G`,使其更加清晰 (8认同)
  • +1 - 非常详尽的答案。我从来不知道一个人可以重新安装/即时。很高兴知道。 (7认同)
  • @its_me Q1:我展示了一个带有 `remount` 选项的 `mount` 命令,所以它不使用 `fstab`。有两次 `acl` 意味着文件系统已经用 `acl` 选项挂载了,而且它是无害的。`acl` [是默认值](http://unix.stackexchange.com/questions/79970/mount-options-shown-in-proc-mounts) 在最近的内核中用于 ext4,顺便说一下(补丁仍然是品牌我写这个答案时又回来了)。Q2:您可以按任一顺序运行命令。 (3认同)

gee*_*aur 113

您可以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
Run Code Online (Sandbox Code Playgroud)

请注意,您必须为每个子目录执行chgrp/ chmod;它不会自动传播(也就是说,setgid目录下的现有目录和随后创建的目录都不会是setgid,尽管后者将在 group 中GROUPNAME)。

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

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

  • 在父目录上设置 setgid 后创建的子目录将自动设置 setgid。 (13认同)
  • 在 Debian(我假设大多数其他 Linux 发行版)上,setgid 和组名都会传播。 (3认同)
  • 在 OS X 上,目录上的 setgid 位会被忽略;新文件和目录*总是* 给定其包含目录的组。 (3认同)
  • @Arrowmaster:在某些系统上,也许,但不是全部;我在 OSX 上测试过,它不会传播,至少对于非 root 用户来说是这样。 (2认同)

Fah*_*tha 27

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

我不知道有什么好的acl教程,但你可以做得比http://www.vanemery.com/Linux/ACL/linux-acl.html更糟糕

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

另请注意,您需要在acl支持下安装您正​​在使用的分区,例如。

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2
Run Code Online (Sandbox Code Playgroud)

会话如下:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x
Run Code Online (Sandbox Code Playgroud)

设置组的foostaff,并设置组和用户的访问控制列表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
Run Code Online (Sandbox Code Playgroud)

将用户和组的默认 acls 也设置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::---
Run Code Online (Sandbox Code Playgroud)

现在foo以用户faheemjohn.

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

# switch to user john for this next command.

/mnt/acl/foo$ touch baz
Run Code Online (Sandbox Code Playgroud)

列出文件。请注意,文件拥有者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
Run Code Online (Sandbox Code Playgroud)