如果我创建一个文件,然后将其权限更改为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。
答案1
所有的rm
需求都是写入+执行的许可家长目录。文件本身的权限是无关的。
这是一个参考这比我更清楚地解释了权限模型:
任何访问文件数据的尝试都需要读取权限。任何修改文件数据的尝试都需要写入权限。任何执行文件(程序或脚本)的尝试都需要执行权限...
由于目录的使用方式与常规文件不同,因此权限的工作方式略有不同(但仅略有不同)。尝试列出目录中的文件需要对该目录的读取权限,但不需要对其中的文件的读取权限。 尝试将文件添加到目录、从目录中删除文件或重命名文件,都需要目录的写权限,但(也许令人惊讶)不需要目录中的文件的写权限。执行权限不适用于目录(目录不能同时是程序)。但该权限位可重复用于其他目的的目录。
需要对目录具有执行权限才能通过 cd 进入该目录(即,使某个目录成为当前工作目录)。
需要在目录上执行才能访问其中文件的“inode”信息。您需要它来搜索目录以读取其中文件的索引节点。因此,目录上的执行权限通常称为搜索权限。
答案2
好的,根据您对 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
这个问题的一个答案声称只有在具有权限的情况下才可以从目录中删除文件,write
这是完全错误的!去尝试一下!给一个目录公正的write
权限并尝试删除,你不能!
要删除目录中的文件,您需要目录的write
权限execute
现在回到问题:要删除文件,rm
您只需从目录中删除其索引节点信息,即您不是shredding
从磁盘中删除它。如果文件的 inode 信息不在您无法访问的目录中(也是因为您看不到它,因为它没有按其父目录列出),即它是已删除为你。
因此,要从目录中删除文件,您只需拥有目录的权限即可;该文件的权限无关