我想保护 $HOME 中的文件夹不被意外删除。我已应用chattr +i
这些操作,但我注意到最后一个操作是递归应用的,因此,该文件夹确实无法删除,但我也无法在其中写入内容。
我也尝试过粘着位使用chmod 1775
并使用 更改文件夹的所有权chown root foldername
。通常,启用粘性位后,只有文件夹的所有者才能删除它,但奇怪的是,在我的情况下,虽然文件夹归 root 所有,但我可以用普通用户删除它。
我注意到,分区中的用户文件夹/home
虽然归当前用户所有,并且具有读写所有者的权限,无法删除/更改。这是如何实现的?
我正在使用 Arch Linux 32 位,文件系统是 ext4。
答案1
我想保护 $HOME 中的文件夹不被意外删除。我对它们应用了 chattr +i,但我注意到最后一个是递归应用的,因此,确实无法删除该文件夹,但我也无法在其中写入内容。
它不是递归的,只是目录的工作方式。目录基本上是一个带有名称和 inode 列表的特殊文件。(至少以前是;cat
在某些 BSD 上仍然可以使用目录。)当您尝试创建、重命名或删除文件时,您不会更改文件本身,而是更改其父目录。如果目录标记为不可变,则您无法更改它 - 但子目录仍然可以修改。
我还尝试使用 chmod 1775 应用粘性位,并使用 chown root foldername 更改文件夹的所有权。通常,启用粘性位后,只有文件夹的所有者才能删除它,但奇怪的是,在我的情况下,虽然文件夹归 root 所有,但我可以用普通用户删除它。
粘性位允许删除对象,前提是你拥有该对象本身或者其父目录。
我注意到 /home 分区中的用户文件夹虽然归当前用户所有,并且所有者具有 rwx 权限,但无法删除/更改它们。这是如何实现的?
参见上文——删除文件系统对象时,你必须对父目录,而不是对象本身。在这种情况下,/home
由 root 拥有,并且您只有“读取”+“执行”权限。
综上所述,
備份。
文件系统对象:n.文件,目录,设备节点,符号链接,管道,Unix 套接字或其他任何可以存储在文件系统上的东西。
答案2
要创建、删除或重命名目录中的项目,您必须对该目录具有写入权限。通常/home
普通用户无法写入,因此您无法在 下创建、删除或重命名目录/home
。
目录上的粘性位增加了一个额外要求,即只有文件或目录所有者(或超级用户)才能删除或重命名目录中的现有项目。它不会阻止您删除您拥有的内容。它适用于公共目录,例如/tmp
,以允许任何人创建新文件,并删除或重命名他们拥有的文件,但阻止删除或重命名其他用户拥有的文件。
使目录不可变 ( chattr +i
) 意味着它根本无法更改,因此无法在其中创建新文件,也无法删除或重命名其中的任何内容。如果您想防止删除目录但仍希望能够在其中创建、删除和重命名文件,您可以通过在目录中创建一个不可变文件来实现,因为只要目录中有内容,就无法删除目录。或者,您可以创建一个没有写入权限的子目录,该子目录至少包含一个文件。
答案3
有点晚了,但chattr +a
(可选-R
递归)将允许您创建新文件但不能删除它们。
该+a
标志强制仅附加到目录(而+i
强制它是不可变的)。
这意味着当您尝试删除文件时,操作系统将尝试将其从目录中删除,这将失败,导致整个删除操作失败。