備份。

備份。

我想保护 $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强制它是不可变的)。

这意味着当您尝试删除文件时,操作系统将尝试将其从目录中删除,这将失败,导致整个删除操作失败。

相关内容