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


91

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

如果我这样做:

echo test > test.txt
chmod 444 test.txt
rm test.txt

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

谁能澄清?我正在使用Ubuntu 12.04 / bash。


澄清:我以普通用户而不是root用户身份运行这些命令。
Magnus 2012年

Answers:


104

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

这是一个参考资料,它比我能更清楚地解释权限模型:

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

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

必须具有目录的执行权限才能将其插入CD(也就是说,使某个目录成为当前的工作目录)。

在目录上需要执行以访问其中文件的“ inode”信息。您需要使用它来搜索目录以读取其中文件的索引节点。因此,通常将目录的执行许可权称为搜索许可权。


2
因此,如果我想创建一个目录,其中的某些文件必须先执行chmod才能删除/更改,而另一些文件可以自由写入,那将不可能吗?我将不得不chmod目录555,这意味着该目录中的任何文件都无法创建或修改。
Magnus 2012年

3
@Magnus-当然,没有什么可以阻止您在只读目录中创建可写子目录,并将可写文件存储在其中。子目录本身不能删除,但是其内容可以删除。
ire_and_curses 2012年

7
您是否不能使目录保持不变,+t以便人们即使拥有对该目录的写权限,也无法再修改或删除该目录中不属于他们的文件?
Shadur 2012年

3
@Magnus如果您具有root用户访问权限(包括sudo),则可以用于chattr将不可变标志添加到文件中。如果不是,则ire_and_curses是非常正确的。
詹姆斯·奥戈曼

6
不使用rm -f仅在我清醒的情况下有效...另外,我不知道我编写的智障bash脚本可能会或可能不会做什么
Magnus 2012年

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

您不能对不可变文件执行任何操作-无法删除,编辑,覆盖,重命名,chmod或chown它或其他任何操作。您唯一可以做的就是读取它(如果允许Unix权限)和(作为root用户)chattr -i删除不可变位。

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


3
偶尔有用。顺便说一句,甚至不是root都可以修改或删除不可变文件(并非不先删除不可变属性)。顺便说一句,用于lsattr列出属性。
cas 2012年

2
+ rm
1-

2
这是特定于文件系统的,可能会给您带来更多需要解决的问题。
斯特凡希门尼斯

4
@Magnus:可能的问题包括备份(并非所有备份实用程序都会备份属性-实际上,大多数备份都不会)和还原(如果还原到已经包含不可变文件的目录,则某些程序将无法覆盖该文件作为致命错误并中止)。如果忘记了使文件变得不可变并且无法弄清楚为什么不能删除它,也会引起混乱。...“不允许操作”错误消息与某些文件系统中看到的错误消息相同腐败,可能导致潜在的危险过度反应。
cas 2012年

1
可以复制(cp)不可变文件。
章鱼

0

这个问题的一个答案是,只有具有write权限的文件才可以从目录中删除,这是完全错误的!去尝试一下!只write授予目录权限,然后尝试删除,就不能!
要删除您需要同时获得目录中的文件writeexecute权限上目录

现在回到问题:使用文件删除rm只是从目录中删除它的inode信息,即您不是shredding从磁盘上删除它。如果文件的inode信息不在目录中,则您将无法访问(也因为由于其父目录未列出该文件,因此您无法看到它),即为您删除了该文件。
这样就可以从目录中删除文件,您就拥有目录权限;该文件的权限无关紧要

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.