it-swarm.cn

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

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

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

132
student

您可以通过将目录setgid设置为umask,来使用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,尽管后者将位于GROUPNAME组中)。

还要注意,umask是一个进程属性,适用于由该进程及其子级创建的所有文件(它们在fork()时在其父级中实际上继承了umask)。用户可能需要在_~/.profile_中进行设置,并且可能需要注意与目录无关的需要不同权限的内容。如果在做不同的事情时需要不同的设置, modules 可能会有用。

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

96
geekosaur

如果可能,请使用 访问控制列表(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/directorys在这里表示setgid位;对于目录,这意味着在此目录中创建的文件将属于拥有该目录的组。

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

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

这个问题非常适合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

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

现在以foofaheem的身份在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
24
Faheem Mitha