Linux目录权限读写但不可删除

64

是否可以设置目录权限,使一个组能够读取和写入文件和子目录,但不能删除任何内容?


我理解“删除任何内容”包括禁止对现有文件进行任何修改。这是你的意思吗?你的用户是否直接访问文件系统,还是通过NFS、Samba或其他途径(FTP)进入? - jmanning2k
3个回答

54

在目录上设置粘滞位(sticky bit)可能已经足够了。用户将能够删除他们自己拥有的任何文件,但不是其他用户的文件。这可能已经足够满足您的使用情况。在大多数系统中,/tmp 是以此方式设置的(/tmp 设置为 1777)。

chmod 1775 /controlled

然而,如果您想要更多的控制,您需要在所涉及的文件系统上启用 ACL。

在 /etc/fstab 中,将 acl 添加到标志中:

/dev/root        /                       ext3    defaults,acl       1 1
您可以使用setfacl/getfacl来控制和查看acl级别的权限。
例如:(创建文件后,它们是只读的,但所有者可以删除它们,其他人无法删除。)
setfacl --set u::rwxs,g::rwx /controlled
setfacl -d --set u::r-x,g::r-x,o::- /controlled

你可以在一个目录上设置默认的acl列表,这个列表会被所有在该目录下创建的文件使用。

正如其他人所指出的那样,要小心地准确说明你想要的内容。你说“写入”——但是用户是否可以覆盖自己的文件?他们能改变现有的内容,还是只能追加?一旦写入,它就是只读的吗?也许你可以在评论中提供更详细的信息。

最后,SELinux和Grsecurity提供了更多的控制,但那是一个完全不同的问题。设置可能会相当复杂。


1
你的意思是将 /tmp 设为 1777 吗?其中的 4 表示 SetUID 位(我相信这只在基于 BSD 的系统中对目录有意义)。 - Jonathan Leffler
1
我在运行setfacl --set u::rwxs,g::rwx /controlled(其中"/controlled"是要修改的文件夹)时遇到了各种错误。可以尝试使用setfacl -m u::rwx,g::rwx /controlled来解决问题。 - Buttle Butkus
如果 "1775" 无效(就像对我而言一样),我将其更改为 "1777",然后它就有效了。这将确保每个人都可以写入目录,但无法删除(和读取)其他用户的文件。 - Jobst

18

对于这个目录,它的权限应该是r-x。

而其中的文件应该具有rw-权限。

这是因为只有当一个文件的权限允许写入时才能进行写入操作,但只有该文件所在的目录的权限允许写入时,该文件才能被删除。


你也不能移动文件。 - Selah
粘滞位也非常重要。 - alamar

3

无论如何,确保在您特定的上下文中,使用0字节文件覆盖不等于删除文件。


4
您可以使用'chattr +a'选项,意思是“文件只能以附加模式打开进行写入”,这意味着您不能重写现有内容,但是您可以在末尾添加新内容。这应该可以防止截断。 - jmanning2k
1
然而,chattr +a需要root访问权限才能在新文件上设置。 - bdonlan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接