运维老司机血泪总结:别等删库跑路才后悔
一、那些年我们踩过的rm -rf巨坑
凌晨两点,手机巨震,群里炸锅:“数据库目录被删了!” 你揉着眼睛打开电脑,心跳加速,手指发抖---rm -rf /data/mysql,回车的那一刻,世界安静了。
这不是段子,这是无数运维人的噩梦。
rm -rf / 被称为“运维界核按钮”,敲错一次,轻则加班恢复数据,重则直接“删库跑路”。
但今天我要告诉你:这个悲剧完全可以避免,而且只需要一个不到100KB的小工具---safe-rm 0.12。
二、safe-rm是什么?为什么选0.12?
safe-rm是一个轻量级的rm替代工具,它的核心逻辑极其简单:在黑名单里的目录,谁也删不掉--包括root。
我推荐0.12版本,原因有三:
对比新版safe-rm1.x版,需要rust编译环境,0.12简直是内网离线服务器的救星。
三、5分钟极速部署教程
第一步:下载解压
第二步:复制到系统目录
cp safe-rm-0.12/safe-rm /usr/local/bin/safe-rm
chmod 755 /usr/local/bin/safe-rm
第三步:替换rm
软链接
ln -sf /usr/local/bin/safe-rm /usr/local/bin/rm
或直接move
move safe-rm rm
第四步:确保PATH顺序
echo 'export PATH=/usr/local/bin:$PATH' >> /etc/profile
source /etc/profile
验证是否生效
which rm
# 输出应为:/usr/local/bin/rm
第五步:配置保护黑名单
cat > /etc/safe-rm.conf << 'EOF'
/
/etc
/bin
/sbin
/boot
/dev
/lib
/lib64
/proc
/sys
/usr
/var
/data
/opt
EOF
验证是否生效:看到skipping,你就可以安心了。
四、灵魂拷问:这玩意儿靠谱吗?
1:root也能拦住
是的,safe-rm在程序层面做拦截,即使是root执行rm -rf /,也会被拒绝。它比alias更底层,无法被command rm绕过。
2:会影响系统正常运行吗?
不会,系统脚本通常使用/bin/rm或/usr/bin/rm的绝对路径,不受safe-rm的影响。只有通过PATH解析的rm命令才会走safe-rm。
3:万一我想删黑名单里的目录怎么办? 两步走:
1.先从/etc/safe-rm.conf中移除对应路径
2.执行删除操作
3.操作完立刻加回黑名单
4:和alias rm='rm -i'比那个更好?
safe-rm完胜。rm -i只是多问一句,疲劳操作时照样会手滑输入yes,safe-rm是直接物理拦截,不给手滑的机会。
五、sudo rm不生效的特殊情况
你当前终端which rm已显示/usr/local/bin/rm,但sudo rm仍走原版,是因为sudo默认用secure_path覆盖了PATH:
sudo which rm
# 仍显示 /usr/bin/rm ← 这是正常的 sudo secure_path 行为
修复sudo下的safe-rm(生产推荐做法):
用visudo修改sudoers,调整secure_path把/usr/local/bin方最前
visudo
找到这行(类似):
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
改为:
Defaults secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
保存后验证
sudo which rm
# 应显示 /usr/local/bin/rm