必须用函数封装+alias映射组合拦截rm -rf:定义rmrf()函数记录日志并提示,再用alias映射rm-rf、rm -rf等常见误输形式;同时加固基础rm行为,启用--preserve-root或trash-put,并确保日志权限可控。

不能靠简单 alias 直接拦截带参数的 rm -rf,必须用函数封装 + alias 映射组合实现主动识别和阻断。核心思路是:把常见误输形式(如 rm-rf、rm -rf)映射到一个拦截函数,再在函数中做判断、提示、记录,而非真正执行删除。
定义拦截函数并记录操作日志
在 ~/.bashrc 或全局 /etc/bash.bashrc 中添加以下函数:
-
rmrf()函数捕获调用,并将完整命令、时间、用户、终端信息写入日志文件(例如/var/log/rm-protection.log):
local cmd="rm -rf $*"
local user="$(whoami)"
local tty="$(tty 2>/dev/null || echo 'unknown')"
echo "$(date '+%F %T') | USER:$user | TTY:$tty | CMD:$cmd" >> /var/log/rm-protection.log
echo "⛔ 拦截高危操作:$cmd"
echo "请改用安全方式:"
echo " • 确认后手动执行:command rm -rf \"\$@\""
echo " • 或使用 trash-put \"\$@\""
映射常见误输形式为该函数
仅靠 alias rm='...' 对 rm -rf 无效,因为 shell 先解析参数再匹配 alias。需显式覆盖易错写法:
alias rm-rf='rmrf'alias rm_rf='rmrf'alias 'rm -rf'='rmrf'alias 'rm -Rf'='rmrf'alias 'rm -fr'='rmrf'
这样输入 rm-rf /tmp/test 或 rm -rf /tmp/test 都会被重定向至 rmrf 函数,触发拦截与记录。
加固基础 rm 行为并防止绕过
日常 rm 也需设防,避免单删演变成事故:
- 推荐:
alias rm='rm -Iv --one-file-system --preserve-root'——--preserve-root是关键,能阻止rm -rf /类操作 - 若已安装
trash-cli,更安全:alias rm='trash-put',所有删除进回收站 - 为防用户用
\rm -rf绕过 alias,可在函数内加检测(如检查$0是否含rm和-r.*f),但更可靠的是配合safe-rm工具或chattr +i锁定关键路径
启用日志并确保权限可控
记录日志需注意两点:
- 创建日志文件并设为追加可写:
sudo touch /var/log/rm-protection.log && sudo chmod 644 /var/log/rm-protection.log - 普通用户只能追加,不可清空或修改旧记录;管理员可定期归档或用
logrotate管理 - 如需审计所有
rm调用(包括绕过 alias 的),建议开启 bash 命令历史审计:export PROMPT_COMMAND='history -a'并配置HISTTIMEFORMAT

















