暂无菜单项

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

发布于
11

AI Agent 能帮我们跑命令、整理项目、清理文件,但它也可能把危险命令执行得非常干脆。源文记录了一个很典型的翻车场景:OpenClaw 在执行清理任务时跑出了 rm -rf ~/,Shell 会把 ~ 展开成当前用户目录,结果就变成了递归删除整个用户目录。

如果你也在使用 小龙虾 OpenClaw、Claude Code、Codex CLI 或其他本地 Agent 工具,这篇教程很值得补上:给 rm 加一层保护,让危险删除先被拦截,普通递归删除则尽量转到废纸篓。

OpenClaw rm 删除保护封面
OpenClaw rm 删除保护封面
先说结论:不要让 AI Agent 在没有保护的环境里自由执行 rm -rf。尤其是 ~/$HOME/Users/用户名/ 这类路径,一旦展开后执行,后果可能非常直接。

事故原因:一个没有引号的 rm 命令

源文里的问题出在这行命令:

rm -rf ~/

在 zsh/bash 里,~ 会展开成当前用户目录。也就是说,它实际可能变成:

/Users/yourname/

如果 Agent 正在执行“清理文件”之类任务,又没有额外确认机制,就可能把 Desktop、Music、Pictures、Documents 等目录一起删掉。源文最后靠 NAS 同步恢复了大部分文件,但这种体验对任何创作者都不友好。

OpenClaw 执行清理任务时的误删风险截图
OpenClaw 执行清理任务时的误删风险截图

两层防护思路

第一层:危险路径直接拦截

不管输入的是 rm -rf ~/rm -rf $HOME,还是展开后的 rm -rf /Users/yourname,只要目标命中用户主目录或系统关键路径,就直接报错退出。

第二层:保护常用目录

对于 DesktopDocumentsDownloadsMusicMoviesPictures.ssh.openclaw.config 这类目录,递归删除也应该直接拦截。

完善建议:视频后期和 CG 用户可以把项目盘、素材盘、工程目录、数据库目录、同步盘目录也加入保护列表。AI Agent 能写文件是优势,但它不应该拥有“无保护删除一切”的权限。

实现方式:在 .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 -rfchmod -Rchown -R、覆盖写入等操作时,尽量人工确认。
  • 先 dry-run:让 Agent 先列出将要删除的文件,不要直接执行删除。
  • 保持备份:Time Machine、NAS、云盘版本历史都很重要,AI 自动化越深入,备份越不能省。
做视频网观点:本地 Agent 的价值在于能真的操作电脑,但这也意味着它会继承终端命令的破坏力。给 rm 加保护不是小题大做,而是让 AI 工作流进入真实生产环境前必须补的一道保险。

总结

这篇教程的核心不是“OpenClaw 不安全”,而是提醒我们:任何能执行本地命令的 AI Agent,都应该有文件保护机制。对于视频后期、CG、设计和开发工作流来说,素材和工程文件往往比软件本身更值钱。

如果你正在使用 OpenClaw 这类本地 Agent,建议先把 rm 删除保护、项目备份、命令审批这三件事补上,再让 AI 承担更复杂的自动化任务。

常见问题(FAQ)

为什么 OpenClaw 这类 Agent 需要 rm 删除保护?
因为本地 Agent 可以执行终端命令,一旦误执行 rm -rf ~/、rm -rf $HOME 或类似危险路径,可能直接删除用户目录、素材库和工程文件。删除保护可以在命令执行前拦截高风险路径。
这段 rm 保护代码适合所有系统吗?
文章里的方案主要面向 macOS zsh,并依赖 trash 命令把递归删除转入废纸篓。Linux、Windows 或不同 Shell 需要按环境调整,不建议未经测试直接用于生产项目。
0 点赞
0 收藏
分享
0 讨论
反馈
0 讨论
热门最新
总结
暂无总结
0 / 600
嗨,下午好!
所有的成功,都源自一个勇敢的开始
近期热门