Linux中避免rm -rf 误删操作
一、先清理旧方案(如果之前建过 profile.d 的脚本)
# 如果之前建过就删,没建过执行也无害
/bin/rm -f /etc/profile.d/safe_rm.sh
# 清掉当前 shell 里可能残留的 alias / hash
unalias rm 2>/dev/null
hash -r二、创建方案 C 的 rm 包装脚本
cat > /usr/local/bin/rm <<'EOF'
#!/bin/bash
# 安全 rm 包装:只拦截真正危险的删除操作
# 保留:rm /tmp/xxx、rm /var/log/*.log 等正常绝对路径操作
# 拦截:rm -rf /、rm -rf /*、rm -rf /.*、--no-preserve-root 等
for p in "$@"; do
# 跳过选项参数(-f, -r, -rf, --preserve-root 等)
[[ "$p" == -* ]] && continue
# 1) 根目录本身
if [[ "$p" == "/" ]]; then
echo -e "\033[31m[安全拦截] 禁止删除根目录:$p\033[0m" >&2
exit 1
fi
# 2) 根目录下的通配删除,如 /* /.* /[a-z]*
# 特征:以 / 开头,剩余部分不含 / 但含 * 或 ? 或 [
if [[ "$p" =~ ^/[^/]*[*?\[] ]]; then
echo -e "\033[31m[安全拦截] 禁止删除根目录通配:$p\033[0m" >&2
exit 1
fi
done
# 3) 禁止 --no-preserve-root(rm -rf / 的经典危险写法)
for a in "$@"; do
if [[ "$a" == "--no-preserve-root" ]]; then
echo -e "\033[31m[安全拦截] 禁止使用 --no-preserve-root\033[0m" >&2
exit 1
fi
done
exec /bin/rm "$@"
EOF
chmod +x /usr/local/bin/rm三、让当前 shell 立即识别新脚本
hash -r
type rm期望输出:
rm is /usr/local/bin/rm四、验证
# 应被拦截
rm -rf /
rm -rf /*
rm -rf /.*
rm -rf --no-preserve-root /
# 应正常执行
mkdir -p /tmp/safetest && touch /tmp/safetest/a.txt
rm -rf /tmp/safetest
rm -f /var/log/dmesg.old 2>/dev/null # 若存在则删,正常被拦截时你会看到红色提示,比如:
[安全拦截] 禁止删除根目录:/五、确认 PATH 顺序(关键)
echo $PATH你的输出是:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin/usr/local/bin 排在 /usr/bin 前面 ✅,脚本会被优先调用,无需再改 PATH。
六、最终状态检查清单
# 1. 无 alias 干扰
alias | grep rm # 应无输出
# 2. rm 指向新脚本
type rm # 应为 /usr/local/bin/rm
# 3. 脚本存在且可执行
ls -l /usr/local/bin/rm # 应有 x 权限
# 4. 旧脚本已删
ls /etc/profile.d/safe_rm.sh # 应显示 No such file全部符合就完成了。
七、回滚(万一需要)
/bin/rm -f /usr/local/bin/rm
hash -r 
