解决 root 无法删除文件的问题

使用 linux 的过程中,我们一直都说 root 是万能的,甚至有玩笑说,清理垃圾最快捷的方法就是: rm -rf / ,但是在使用过程中,我们也会遇到 root 用户使用 rm -rf 也无法删除的问题。以最近流行的 linux 版 360 为例(360safeforlinux)。

360 在安装时,会在 /etc 目录新建一个 360safe 目录,为了防止其他软件删除或者用户误删,设置了特殊权限。直接使用 root 删除结果如下:

1
2
3
4
5
6
7
8
➜  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 可以看到。

1
2
3
4
5
6
7
8
  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 命令即可:

1
2
3
4
5
6
7
8
9
10
  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 属性后,就可以直接删除了:

1
2
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:可以直接访问压缩文件的内容。