使用safe-rm避免rm命令误删文件

前言

在Linux系统下,超级用户如果使用 rm -rf / ,那就相当于系统自杀,会造成业务灾难。

根据最新的POSIX.1-2008标准,rm -fr / 命令是不会被执行的,而是应该打印错误信息。但是老的POSIX.1-2004标准则无此定义,那么这个有什么意义呢?在Linux中,我们所使用的 rmtouchmkdircpmv 等命令都是由 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
2
3
4
5
6
7
8
9
[root@CentOS-6.8 ~]# uname -r
2.6.32-642.el6.x86_64
[root@CentOS-6.8 ~]# rpm -qi coreutils | grep -i version
Version : 8.4 Vendor: CentOS
[root@CentOS-6.8 ~]#

[root@CentOS-6.8 ~]# rm -fr /
rm: it is dangerous to operate recursively on `/'
rm: use --no-preserve-root to override this failsafe
1
2
3
4
5
6
7
[root@CentOS7 ~]# uname -r
4.14.14-1.el7.elrepo.x86_64
[root@CentOS7 ~]# rpm -qi coreutils | grep -i version
Version : 8.22
[root@CentOS7 ~]# rm -fr /
rm: it is dangerous to operate recursively on ‘/’
rm: use --no-preserve-root to override this failsafe

提示的意思是

1
2
rm: 在"/" 进行递归操作十分危险
rm: 使用 --no-preserve-root 选项跳过安全模式

即便是这样,也无法避免重要文件被误删的情况,因为 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
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@CentOS7 ~]# wget https://launchpad.net/safe-rm/trunk/0.12/+download/safe-rm-0.12.tar.gz
[root@CentOS7 ~]# ar xf safe-rm-0.12.tar.gz
cd safe-rm-0.12

[root@CentOS7 safe-rm-0.12] # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/netpas/bin
[root@CentOS7 safe-rm-0.12] #
[root@CentOS7 safe-rm-0.12] # which rm
alias rm='rm -i'
/usr/bin/rm
[root@CentOS7 safe-rm-0.12] # cp -a safe-rm /usr/local/sbin/
[root@CentOS7 safe-rm-0.12] # ln -sv /usr/local/sbin/safe-rm /usr/local/sbin/rm
‘/usr/local/sbin/rm’ -> ‘/usr/local/sbin/safe-rm’
[root@CentOS7 safe-rm-0.12] #

safe-rm的配置

safe-rm 命令使用两个配置文件,全局配置 /etc/safe-rm.conf 和用户配置 ~/.safe-rm。配置的时候只需要将重要文件或者目录的完整路径输入进去就可以了,每条以回车分隔。例如:

1
/test

注意: 这样写可以避免 test 目录被删除,但无法避免 test 目录下的文件被删除

1
2
/test
/test/*

注意: 这样写可以避免 test 目录和 test 目录下的普通文件被删除,但无法避免 test 目录下链接文件被删除。所以像 /lib/lib64 这种目录,下面会有很多对库文件的链接文件,使用safe-rm并不能保护文件

建议: 作为运维人员,应当严格要求自己,养成良好的维护、操作、及时备份的习惯

有钱任性,请我吃包辣条
0%