前言
在Linux系统下,超级用户如果使用 rm -rf /
,那就相当于系统自杀,会造成业务灾难。
根据最新的POSIX.1-2008标准,rm -fr /
命令是不会被执行的,而是应该打印错误信息。但是老的POSIX.1-2004标准则无此定义,那么这个有什么意义呢?在Linux中,我们所使用的 rm
、touch
、mkdir
、cp
、mv
等命令都是由 coreutils
这个核心工具提供的,coreutils 5.2
稳定版于2004年2月19日发布,而现在 coreutils
工具在 CentOS6
上都已经是8.22版本了(CentOS7
是8.4版本,Debian8
是8.23版本)。只有你的 coreutils
的版本足够高(5.2版本以上),才可以”安全地”使用 rm -fr /
这个指令,老版本的rm还是存在此问题的。
以下是针对CentOS6和CentOS7的验证
1 | [root@CentOS-6.8 ~]# uname -r |
1 | [root@CentOS7 ~]# uname -r |
提示的意思是
1 | rm: 在"/" 进行递归操作十分危险 |
即便是这样,也无法避免重要文件被误删的情况,因为 root 用户是有绝对权限的。很多系统正常运行要依赖各种各样的文件,一旦其中任意一个文件被误删将会造成严重的影响,最明显的表现是各种命令无法正常使用,系统服务无法正常运行
为了避免种误删除操作,我们可以尝试很多办法,回收站机制、给重要目录设置权限、替换 rm 命令等;再做过这些尝试后,个人认为替换 rm 命令比较简单直接,用safe-rm
来替换 rm
便可以满足大部分需求
safe-rm及安装
safe-rm
是一个开源软件用来替代不太安全的rm
,可以在/etc/safe-rm.conf
中配置路径黑名单,定义哪些不能被safe-rm
删除。将safe-rm
更名为 rm
并放在 $PATH
中比 原rm
程序靠前的位置。一些脚本中使用完全路径/bin/rm
则不会受此影响。
safe-rm 的主页:https://launchpad.net/safe-rm
下载Safe-rm 软件包,解压后会得到一个 safe-rm 可执行文件,将这个文件拷贝到系统的二进制可执行程序目录下,但是要保证这个路径在rm命令路径前面
1 | [root@CentOS7 ~]# wget https://launchpad.net/safe-rm/trunk/0.12/+download/safe-rm-0.12.tar.gz |
safe-rm的配置
safe-rm 命令使用两个配置文件,全局配置 /etc/safe-rm.conf
和用户配置 ~/.safe-rm
。配置的时候只需要将重要文件或者目录的完整路径输入进去就可以了,每条以回车分隔。例如:
1 | /test |
注意: 这样写可以避免 test 目录被删除,但无法避免 test 目录下的文件被删除
1 | /test |
注意: 这样写可以避免 test 目录和 test 目录下的普通文件被删除,但无法避免 test 目录下链接文件被删除。所以像 /lib
或 /lib64
这种目录,下面会有很多对库文件的链接文件,使用safe-rm
并不能保护文件。
建议: 作为运维人员,应当严格要求自己,养成良好的维护、操作、及时备份的习惯