命令行操作中,难以避免 rm 命令的使用,如果脑袋昏了或者慢摆拍,很容易误删重要的文件,尤其是用户目录下的,不像根目录那样需要权限确认。

这里可以使用 safe-rm 工具来防止这种意外情况,在对被保护的目录/文件进行删除时,会打印提示并忽略。

安装及配置

Debian/Ubuntu 可以通过命令 apt install safe-rm 来安装,这个工具本质是对 rm 的一层包装,加了目标目录的检查。

安装后当前用户的默认 rm 指令就会指向 safe-rm /usr/share/safe-rm/bin/rm ,这个可以通过 which rm 来确认。接下来,我们可以通过配置 全局和用户级别的 safe-rm 文件来保护需要的目录和文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 全局配置文件路径: /etc/safe-rm.conf
# 这里已经有一些预制的目录,主要是重要的系统级别目录
/
/bin
/boot
/dev
/etc
/home
/initrd
/lib
/proc
/root
/sbin
/sys
/usr
/usr/bin
/usr/include
/usr/lib
/usr/local
/usr/local/bin
/usr/local/include
/usr/local/sbin
/usr/local/share
/usr/sbin
/usr/share
/usr/src
/var
# 在下面,我们可以添加自己需要保护的全局目录/文件,可以使用通配符
/home/*
/home/*/Documents
/home/*/.config
/home/*/.ssh
/home/*/.mozilla

用户级别配置文件在 ~/.config/safe-rm :

1
2
3
# 该配置仅对当前用户有效
# 建议与全局配置一样,用绝对路径配合通配符
/home/*/.local

然后在删除时,如果不小心误写,也可以提醒并忽略:

1
2
rm -rf /
safe-rm: Skipping /.

应用到 sudo 环境

以上配置对当前用户有效,但对 root 命令中调用的 rm 却无效,因为 sudo 会使用安全的环境,safe-rm 无法优先于 rm 调用。

方法是通过命令 sudo visudo 编辑sudoers 文件,找到 Defaults secure_path 行,将 safe-rm 加入:

1
2
# 将 /usr/share/safe-rm/bin 加入 secure_path 中并优先
Defaults    secure_path="/usr/share/safe-rm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

然后通过命令 sudo which rm 来确认是否生效:

1
2
sudo which rm
/usr/share/safe-rm/bin/rm