乐于分享
好东西不私藏

给OpenClaw加上rm删除保护:防止AI误删你的整个电脑

本文最后更新于2026-07-26,某些文章具有时效性,若有错误或已失效,请在下方留言或联系老夜

给OpenClaw加上rm删除保护:防止AI误删你的整个电脑

本来一开始没想写这个文章,因为有点过于丢人了。但是我之前一直推荐大家用OpenClaw,我都翻车了还是本着负责任的态度说说。

之前有个事故,OpenClaw 在执行清理任务的时候跑了一行 rm -rf ~/,没加引号,Shell 直接把 ~ 展开成 /Users/zhheo/,然后整个用户目录就开始被递归删除。

玩梗的段子回旋镖来了

等我发现的时候,Desktop、Music、Pictures 这些文件夹已经没了。好在有极空间 NAS 的 Syncthing 同步,大部分文件恢复了回来,但那个心惊胆战的感觉是真的不好受。

所以这次我给 .zshrc 里的 rm 函数加了一层硬保护。

两层防护

第一层:危险路径拦截

不管你是 rm -rf ~/ 还是 rm -rf /Users/zhheo,只要目标是用户主目录,直接拦截不执行。Shell 展开 ~ 之后变成绝对路径,函数里有一份危险路径黑名单,命中就报错退出。

第二层:受保护目录

Desktop、Documents、Downloads、Music、Movies、Pictures、.ssh、.openclaw、.config 这些目录,rm -rf 直接拦截。精确匹配,rm -rf ~/Music 会被拦。

其他递归删除(比如 rm -rf ~/Music/some_folder)不会被拦截,但会自动转成 trash,文件进废纸篓可恢复。只有非递归的单文件删除才走系统原生 rm

怎么实现的

在 .zshrc 里定义了一个 rm() 函数,覆盖系统的 rm 命令。逻辑很简单:

rm() {# 1. 解析参数,判断是否 -r/-R# 2. 检查目标路径是否在危险列表/保护目录里# 3. 命中 → 报错退出# 4. 没命中且是递归删除 → 自动转 trash# 5. 普通删除 → 正常 rm}

递归删除全部自动转 trash,文件进废纸篓还能恢复。只有非递归的 rm(比如删单个文件)才走系统原生命令。

测试结果

$ rm -rf ~/🚫 危险操作已拦截:rm /Users/zhheo/   这会删除整个用户目录!
$ rm -rf ~/Music🚫 受保护目录,禁止递归删除:/Users/zhheo/Music   如需删除请用 trash 命令手动操作

要加减保护目录的话随时说,改 .zshrc 就行。

其他 OpenClaw 用户怎么用

把下面这段加到你的 ~/.zshrc 里就行(代码仅适用于mac,建议发给你的龙虾帮你添加代码,因为代码可能需要根据环境定制修改)

# rm 安全函数:递归删除自动转 trash,危险路径直接拦截rm() {local has_recursive=falselocal files=()for arg in"$@"docase"$arg"in      -r*|-R*) has_recursive=true ;;      -f*|-i*|-v*|-I*) ;;      --*) ;;      -*) ;;      *) files+=("$arg") ;;esacdone# 保护目录列表(递归删除直接拦截)local protected_dirs=("$HOME/Desktop""$HOME/Documents""$HOME/Downloads""$HOME/Music""$HOME/Movies""$HOME/Pictures""$HOME/.ssh""$HOME/.openclaw""$HOME/.config"  )if$has_recursivethenfor f in"${files[@]}"dofor pd in"${protected_dirs[@]}"doif [[ "$f" == "$pd" || "$f" == "$pd/" ]]; thenecho"🚫 受保护目录,禁止递归删除:$f" >&2echo"   如需删除请用 trash 命令手动操作" >&2return 1fidonedonefi# 危险路径拦截local dangerous_paths=("/Users/zhheo""/Users/zhheo/""$HOME""$HOME/""/""/root""/home"  )for f in"${files[@]}"dofor dp in"${dangerous_paths[@]}"doif [[ "$f" == "$dp" || "$f" == "$dp/" ]]; thenecho"🚫 危险操作已拦截:rm $f" >&2echo"   这会删除整个用户目录!" >&2return 1fidonedoneif$has_recursivethenfor f in"${files[@]}"do      trash "$f" 2>/dev/null || echo"⚠️ 无法移到废纸篓: $f" >&2doneelsecommandrm"$@"fi}

protected_dirs 里可以加你自己的目录,比如项目文件夹、数据库目录之类的。改完跑 source ~/.zshrc 就生效。