解决 root 无法删除文件的问题
使用 linux 的过程中,我们一直都说 root 是万能的,甚至有玩笑说,清理垃圾最快捷的方法就是: rm -rf /
,但是在使用过程中,我们也会遇到 root 用户使用 rm -rf
也无法删除的问题。以最近流行的 linux 版 360 为例(360safeforlinux)。
360 在安装时,会在 /etc
目录新建一个 360safe
目录,为了防止其他软件删除或者用户误删,设置了特殊权限。直接使用 root 删除结果如下:
➜ 360safe sudo rm -rf *
rm: 无法删除"360safe.xml": 不允许的操作
rm: 无法删除"7z.so": 不允许的操作
rm: 无法删除"qex/libqex.so": 不允许的操作
rm: 无法删除"qex/patt.enc": 不允许的操作
rm: 无法删除"qex/MacroDef.enc": 不允许的操作
rm: 无法删除"qex/qex.vdb.enc": 不允许的操作
rm: 无法删除"Rar29.so": 不允许的操作
其实我们平时说的权限控制 chmod
只是表面上简单的设置,其实在 linux 权限管理中,还有一个隐藏属性,是系统为了防止用户误删重要文件所设置的,隐藏属性用 lsattr
可以看到。
➜ 360safe lsattr *
----i--------e-- 360safe.xml
----i--------e-- 7z.so
----i--------e-- qex/libqex.so
----i--------e-- qex/patt.enc
----i--------e-- qex/MacroDef.enc
----i--------e-- qex/qex.vdb.enc
----i--------e-- Rar29.so
隐藏属性中的 i 属性,即 Immutable ,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件,即使是 root 用户也不行。
既然有 ls ,那应该也会有 ch ,我们找到了隐藏属性,那也一定有修改的办法,使用 chattr
命令即可:
➜ 360safe sudo chattr -RVf -i *
chattr 1.42.9 (4-Feb-2014)
360safe.xml的标志被设为 -------------e--
7z.so的标志被设为 -------------e--
qex的标志被设为 ----------------
qex/libqex.so的标志被设为 -------------e--
qex/patt.enc的标志被设为 -------------e--
qex/MacroDef.enc的标志被设为 -------------e--
qex/qex.vdb.enc的标志被设为 -------------e--
Rar29.so的标志被设为 -------------e--
解除掉 i 属性后,就可以直接删除了:
➜ 360safe sudo rm -rf *
➜ 360safe
附: chattr 相关属性:
用法:chattr -参数 +/-/=属性 文件名
相关参数:
-R
递归处理,将指定目录下的所有文件及子目录一并处理。
-v<版本编号>
设置文件或目录版本。
-V
显示指令执行过程。
+<属性>
开启文件或目录的该项属性。
-<属性>
关闭文件或目录的该项属性。
=<属性>
指定文件或目录的该项属性。
相关属性:
A
:即 Atime ,告诉系统不要修改对这个文件的最后访问时间。
S
:即 Sync ,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
a
:即 Append Only
,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。
b
:不更新文件或目录的最后存取时间。
c
:将文件或目录压缩后存放。
d
:当 dump 程序执行时,该文件或目录不会被 dump 备份。
D
:检查压缩文件中的错误。
i
:即 Immutable
,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
s
:彻底删除文件,不可恢复,因为是从磁盘上删除,然后用0填充文件所在区域。
u
:当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件,用来防止意外删除文件或目录。
t
:文件系统支持尾部合并(tail-merging)。
X
:可以直接访问压缩文件的内容。