为什么rm可以删除只读文件?

Mag*_*nus 101 permissions rm files readonly

如果我创建一个文件,然后将其权限更改为444(只读),如何rm删除它?

如果我这样做:

echo test > test.txt
chmod 444 test.txt
rm test.txt
Run Code Online (Sandbox Code Playgroud)

...rm会问我是否要删除写保护的文件test.txt。我原以为rm不能删除这样的文件,我必须先做一个chmod +w test.txt。如果我这样做rm -f test.txt,然后rm将删除文件,甚至没有要求,即使它是只读的。

任何人都可以澄清吗?我正在使用 Ubuntu 12.04/bash。

ire*_*ses 114

所有rm需要的是对父目录的写+执行权限。文件本身的权限无关紧要。

这是一个参考,它比我以往任何时候都更清楚地解释了权限模型:

任何访问文件数据的尝试都需要读取权限。任何修改文件数据的尝试都需要写权限。任何执行文件(程序或脚本)的尝试都需要执行权限...

因为目录的使用方式与常规文件的使用方式不同,所以权限的工作方式略有不同(但只是略有不同)。尝试列出目录中的文件需要对该目录具有读权限,但不需要对其中的文件具有读权限。尝试向目录中添加文件、从目录中删除文件或重命名文件,都需要对该目录具有写权限,但(也许令人惊讶)不需要对其中的文件具有写权限。执行权限不适用于目录(目录不能同时是程序)。但该权限位可用于其他目的的目录。

目录需要执行权限才能 cd 进入它(即,使某个目录成为您当前的工作目录)。

需要在目录上执行以访问其中文件的“inode”信息。您需要它来搜索目录以读取其中文件的 inode。出于这个原因,目录的执行权限通常被称为搜索权限。

  • 难道你不能用 `+t` 使目录变得粘滞,这样人们就不能再修改或删除该目录中不属于他们的文件,即使他们对该目录具有写访问权限? (7认同)
  • 不使用 rm -f 只在我清醒时才有效......另外,我不知道我写的弱智 bash 脚本可能会或可能不会做什么 (6认同)
  • @Magnus - 当然,没有什么能阻止你在只读目录中创建一个可写的子目录,并将你的可写文件存储在其中。子目录本身无法删除,但其内容可以。 (3认同)
  • @Magnus 如果您有 root 访问权限(包括 sudo),您可以使用 `chattr` 将不可变标志添加到文件中。如果不是,那么 ire_and_curses 是非常正确的。 (3认同)
  • 因此,如果我想创建一个目录,其中某些文件在不先执行 chmod 的情况下无法删除/更改,但其他文件可以自由写入,那将是不可能的?我将不得不 chmod 目录 555,这意味着目录中的任何文件都不能被创建或修改。 (2认同)
  • Shadur:除了我没有人在使用这个系统。我想保护自己免受自己的愚蠢。 (2认同)

cas*_*cas 53

好的,根据您对 ire_and_curses 的评论,您真正想做的是使某些文件不可变。你可以用chattr命令来做到这一点。例如:

例如

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied
Run Code Online (Sandbox Code Playgroud)

你不能对一个不可变的文件做任何事情——你不能删除它、编辑它、覆盖它、重命名它、chmod或chown它,或其他任何东西。你唯一能做的就是读取它(如果 unix 权限允许)和(作为 root)chattr -i删除不可变位。

并非所有文件系统都支持所有属性。AFAIK,所有常见的 linux 文件系统都支持 immutable(包括 ext2/3/4 和 xfs。zfsonlinux 目前根本不支持属性)

  • 它偶尔有用。顺便说一句,即使是 root 也不能​​修改或删除不可变文件(首先要删除不可变属性)。顺便说一句,使用 `lsattr` 来列出属性。 (4认同)
  • @Magnus:可能的问题包括备份(并非所有备份实用程序都会备份属性 - 事实上,大多数不会)和恢复(如果您恢复到已经包含不可变文件的目录,某些程序将无法覆盖该文件作为致命错误并中止)。此外,如果您忘记使文件不可变并且无法弄清楚为什么不能删除它,那么您也会使自己感到困惑......“不允许操作”错误消息与您在 *某些* 种类中看到的错误消息相同文件系统损坏,这可能导致潜在危险的过度反应。 (4认同)
  • +1 - 我忘记了属性,并且忙于回答有关“rm”的字面问题,以至于我从来没有想过…… (2认同)
  • 这是特定于文件系统的,这可能会给您带来更多它解决的问题。 (2认同)