如何设置目录允许用户创建具有755权限的文件

如何设置目录允许用户创建具有755权限的文件

我想在 Linux 中创建目录(共享)并允许所有用户在该共享目录中创建文件。此外,仅应允许创建文件的用户删除/修改自己的文件,其余所有用户应限制 /Shared 目录中的读取执行权限(705 或 755)。

例如,如果用户 TOM 在共享目录中创建了名为“sample”的文件,则用户 TOM 应为 /shared 中“sample”文件的所有者。用户 Jack 和用户 Matt 应仅限于对该文件“sample”的读取和执行权限,这意味着应在 /Shared 目录中对“sample”文件设置 755 权限。我想阻止其他用户编辑和删除共享目录中由用户 TOM 创建的文件。我该如何实现?

谢谢,CG

答案1

从评论中,您要求自动获取常规文件执行权限,这是困难的部分。

open(2)当使用/系列的系统调用打开文件进行写入时creat(2),程序必须提供一个mode参数,该参数用作设置文件权限的基值。在大多数创建常规文件的程序中,该参数通常指定为模式 0666。只有有意创建可执行文件的程序才会使用模式 0777 作为基值。

操作系统将获取此基本模式值和用户的网络掩码设置,并用它们执行二进制 AND 运算。仅存在于中的模式位两个都基本模式值将应用网络掩码值。结果直接用作chmod结果文件的值。没有任何机制可以添加调用要创建的文件的程序未请求的权限;该umask值只能进一步限制权限。

对于创建目录,mkdir(2)使用了不同的系统调用,其权限机制完全相同......但基本上每个人在调用创建新目录时都使用基本模式值0777。

POSIX ACL 使用类似的机制来确定是否分配执行权限,因此它们也不会默认帮助您向所有文件授予执行权限。

据我所知,在 Unix 风格的文件系统中实现你想要的唯一方法是重建用户使用的每个程序创建文件时使用基本模式 0777。但是这些程序将创建具有执行权限的文件到处,而不仅仅是在一个特定目录中。

但请注意,我说的是“Unix 风格的文件系统”。非 UNIX 文件系统将采用完全不同的方式来处理文件权限。如果您可以将 NTFS 文件系统用于您的特殊目录,也许其本机 ACL 可以默认强制为文件分配执行权限?

答案2

这些是文件夹的默认权限/tmp。所以可以创建目录然后分配权限1777:

mkdir /path/to/Shared
chmod 1777 /path/to/Shared

然后,要微调新文件的权限,请设置用户权限掩码umask。例如,里面/tmp

rm /tmp/test
umask 011
touch /tmp/test
ls -l /tmp/test
-rw-rw-rw- 1 user user 0 nov 21 17:14 /tmp/test

与另一个面具:

rm /tmp/test
umask 022
touch /tmp/test
ls -l /tmp/test
-rw-r--r-- 1 user user 0 nov 21 17:15 /tmp/test

umask 对于​​用户来说是全局的。我不知道这是否有帮助。

答案3

大多数 POSIX 用户不了解基本权限。您拥有所有者/组/其他角色,每个角色都具有“rwx”权限,但三个 rwx 集中只有一组适用于任何一个用户或进程。如果您是所有者,那么您不能是团体或其他!如果文件权限为 007,则意味着所有者和文件组中的任何用户都无法访问它 - 仅限 non-owner_non-group-member=other!

目录下的文件的创建和删除是指目录的权限,与文件的权限无关。如果您具有目录写入权限(基于所有者/组/其他之一),那么您可以创建和删除该目录中的任何文件。 [请注意,root 具有 CAP_DAC_OVERRIDE 功能,因此可以覆盖这些 DAC 权限限制]。

幸运的是,目录还具有粘滞位权限,该权限仅允许文件所有者删除(取消链接)该文件。

您应该将目录创建为:

sudo mkdir somedir
sudo chmod 1707 somedir # set sticky bit

用户可能在 somedir 下创建的子目录通常(请参阅 umask)具有 755 权限(其他人可以读取和搜索,但不能写入该目录),并且在此类子目录下创建的文件将具有 544 权限,但是所有者可以选择添加执行权限。

相关内容