如果我创建一个文件,然后将其权限更改为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用户身份运行这些命令。

#1 楼

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

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


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

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

对目录有执行许可,才能将其cd进入该目录(即创建一个目录)您当前的工作目录)。

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


评论


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

–马格努斯
2012年9月19日上午8:50

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

–ire_and_curses
2012年9月19日在8:57



您是否不能使目录带有+ t标记,以便人们即使拥有对该目录的写访问权,也无法再修改或删除他们不拥有的目录中的文件?

– Shadur
2012年9月19日在12:10

@Magnus如果您具有root用户访问权限(包括sudo),则可以使用chattr将不可变标志添加到文件。如果不是,则ire_and_curses是非常正确的。

–詹姆斯·奥戈曼(James O'Gorman)
2012年9月19日在12:49

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

–马格努斯
2012年9月19日在16:27



#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权限)和(作为根用户)chattr -i以删除不可变位。 AFAIK,所有常见的linux文件系统(包括ext2 / 3/4和xfs都支持不可变的。zfsonlinux目前根本不支持属性)

评论


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

–cas
2012年9月19日上午9:13

+1-我忘记了属性,并且忙于回答有关rm的字面问题,以至于我什至没有想到...

–ire_and_curses
2012-09-19 9:16



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

–StéphaneGimenez
2012年9月19日在12:44

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

–cas
2012年9月19日在21:53

您可以复制(cp)不可变文件。

–章鱼
2015年5月5日15:07

#3 楼

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

writeexecute的权限。使用rm,您只是从目录中删除其inode信息,即您不是从磁盘上。如果文件的inode信息不在目录中,则您将无法访问(也因为它未在其父目录中列出,因此您无法看到它),即为您删除了它。是目录权限;该文件的权限无关紧要