AI Agent 能帮我们跑命令、整理项目、清理文件,但它也可能把危险命令执行得非常干脆。源文记录了一个很典型的翻车场景:OpenClaw 在执行清理任务时跑出了 rm -rf ~/,Shell 会把 ~ 展开成当前用户目录,结果就变成了递归删除整个用户目录。
如果你也在使用 小龙虾 OpenClaw、Claude Code、Codex CLI 或其他本地 Agent 工具,这篇教程很值得补上:给 rm 加一层保护,让危险删除先被拦截,普通递归删除则尽量转到废纸篓。

rm -rf。尤其是 ~/、$HOME、/Users/用户名、/ 这类路径,一旦展开后执行,后果可能非常直接。事故原因:一个没有引号的 rm 命令
源文里的问题出在这行命令:
rm -rf ~/在 zsh/bash 里,~ 会展开成当前用户目录。也就是说,它实际可能变成:
/Users/yourname/如果 Agent 正在执行“清理文件”之类任务,又没有额外确认机制,就可能把 Desktop、Music、Pictures、Documents 等目录一起删掉。源文最后靠 NAS 同步恢复了大部分文件,但这种体验对任何创作者都不友好。

两层防护思路
第一层:危险路径直接拦截
不管输入的是 rm -rf ~/、rm -rf $HOME,还是展开后的 rm -rf /Users/yourname,只要目标命中用户主目录或系统关键路径,就直接报错退出。
第二层:保护常用目录
对于 Desktop、Documents、Downloads、Music、Movies、Pictures、.ssh、.openclaw、.config 这类目录,递归删除也应该直接拦截。
实现方式:在 .zshrc 里覆盖 rm
实现方式是在 ~/.zshrc 里定义一个 rm() 函数,覆盖终端里的 rm 命令。它的逻辑可以理解为:
rm() {
# 1. 解析参数,判断是否 -r/-R
# 2. 检查目标路径是否在危险列表/保护目录里
# 3. 命中后报错退出
# 4. 没命中且是递归删除,自动转 trash
# 5. 普通删除,正常走系统 rm
}如果是递归删除,脚本会先检查危险路径和受保护目录;没命中时,不直接永久删除,而是调用 trash 把文件移入废纸篓。只有普通的单文件删除,才继续走系统原生 rm。
完整代码:适用于 macOS zsh
把下面这段加入 ~/.zshrc。注意先安装或确认系统里有 trash 命令;如果没有,可以通过 Homebrew 安装 trash-cli 或使用你习惯的废纸篓命令替代。
# rm 安全函数:递归删除自动转 trash,危险路径直接拦截
rm() {
local has_recursive=false
local files=()
for arg in "$@"; do
case "$arg" in
-r*|-R*) has_recursive=true ;;
-f*|-i*|-v*|-I*) ;;
--*) ;;
-*) ;;
*) files+=("$arg") ;;
esac
done
# 保护目录列表:递归删除这些目录时直接拦截
local protected_dirs=(
"$HOME/Desktop"
"$HOME/Documents"
"$HOME/Downloads"
"$HOME/Music"
"$HOME/Movies"
"$HOME/Pictures"
"$HOME/.ssh"
"$HOME/.openclaw"
"$HOME/.config"
)
if $has_recursive; then
for f in "${files[@]}"; do
for pd in "${protected_dirs[@]}"; do
if [[ "$f" == "$pd" || "$f" == "$pd/" ]]; then
echo "危险操作已拦截:受保护目录,禁止递归删除:$f" >&2
echo "如需删除请用 trash 命令手动操作" >&2
return 1
fi
done
done
fi
# 危险路径拦截:按需把 /Users/yourname 改成自己的用户目录
local dangerous_paths=(
"$HOME"
"$HOME/"
"/Users/yourname"
"/Users/yourname/"
"/"
"/root"
"/home"
)
for f in "${files[@]}"; do
for dp in "${dangerous_paths[@]}"; do
if [[ "$f" == "$dp" || "$f" == "$dp/" ]]; then
echo "危险操作已拦截:rm $f" >&2
echo "这可能删除整个用户目录或系统关键目录!" >&2
return 1
fi
done
done
if $has_recursive; then
for f in "${files[@]}"; do
trash "$f" 2>/dev/null || echo "无法移到废纸篓:$f" >&2
done
else
command rm "$@"
fi
}/Users/yourname 一定要改成你自己的用户目录,或者直接只保留 $HOME。修改 shell 配置前,建议先复制一份 ~/.zshrc 备份。生效与测试
保存 ~/.zshrc 后,执行:
source ~/.zshrc然后先做两组测试,不要一上来就在真实项目目录里试:
$ rm -rf ~/
危险操作已拦截:rm /Users/yourname/
这可能删除整个用户目录或系统关键目录!$ rm -rf ~/Music
危险操作已拦截:受保护目录,禁止递归删除:/Users/yourname/Music
如需删除请用 trash 命令手动操作给 OpenClaw 用户的额外建议
- 把重要目录加入保护:例如素材库、工程目录、客户文件夹、NAS 同步目录。
- 把危险命令加入审批:涉及
rm -rf、chmod -R、chown -R、覆盖写入等操作时,尽量人工确认。 - 先 dry-run:让 Agent 先列出将要删除的文件,不要直接执行删除。
- 保持备份:Time Machine、NAS、云盘版本历史都很重要,AI 自动化越深入,备份越不能省。
rm 加保护不是小题大做,而是让 AI 工作流进入真实生产环境前必须补的一道保险。总结
这篇教程的核心不是“OpenClaw 不安全”,而是提醒我们:任何能执行本地命令的 AI Agent,都应该有文件保护机制。对于视频后期、CG、设计和开发工作流来说,素材和工程文件往往比软件本身更值钱。
如果你正在使用 OpenClaw 这类本地 Agent,建议先把 rm 删除保护、项目备份、命令审批这三件事补上,再让 AI 承担更复杂的自动化任务。
