首页/文章/Claude Code 的 Bash(rm -rf *) 规则挡不住 rm -r -f:权限规则按字面匹配,要这样写

Claude Code 的 Bash(rm -rf *) 规则挡不住 rm -r -f:权限规则按字面匹配,要这样写

· Zumac.Ai

一个常见的写法漏洞

@AgentRigs 在点评一份公开的 Claude Code 配置时,先夸它把强推(force push)、npm publish 这类操作放进了 ask 规则,让 agent 停下来等人确认,而不是直接失败;接着提醒:Bash(rm -rf:*) 抓不到 rm -r -f 或 rm -Rf,这些也要加上。

为什么会漏

官方 Permissions 文档 写得很清楚:Claude Code 会把规则里第一个 * 之前的文字按原样匹配。Bash(rm -rf *) 要求命令文字以 rm -rf 开头,rm -r -f build/、rm -Rf build/、rm -fr build/ 的开头都不一样,所以不会命中。:* 只是结尾通配的另一种写法,Bash(rm -rf:*) 和 Bash(rm -rf *) 效果相同。

更稳的写法

  1. 按程序写,不按参数写:把 Bash(rm *) 放进 ask(或 deny),它能覆盖所有以 rm 开头的命令,不管参数怎么排列。注意空格:文档说明结尾 * 前的空格是规则的一部分,Bash(rm*) 会连带匹配别的以 rm 开头的程序名。
  2. deny / ask 规则能跨过前置变量:文档举例,deny 里的 Bash(rm *) 仍会匹配 FOO=bar rm -rf tmp/。
  3. 组合命令会拆开逐段检查:cd x && rm -rf y 里的 rm 部分照样会被规则看到。

规则不是安全边界

文档专门有一段提醒:Bash 规则匹配的是 Claude 写出来的命令文字,不匹配同一个程序的其他调用形式。例如 Bash(rm *) 拦得住 rm -rf build/,拦不住 /bin/rm -rf build/ 或 bash -c 'rm -rf build/'。还有 npx、docker exec、devbox run 这类会执行参数的工具,Bash(devbox run *) 实际上放行了它后面的任何命令。

所以,真正要防误删的场景,应该叠加:

  • 沙箱:限制命令能写哪些目录;
  • PreToolUse hook:对包含删除动作的命令做更细的检查;
  • 备份与版本控制:长期运行的机器上,重要目录要有快照。

小结

权限规则适合挡住「agent 常用的那种写法」,写的时候按程序覆盖、别按参数覆盖;真正兜底的还是沙箱、hook 和备份。

如果你想把 Claude Code 放在一台常开、整机独享的新加坡 Mac mini 上长期运行,可以了解 Zumac.Ai,咨询 Telegram @singatao。

来源

Zumac.Ai 新加坡 Mac mini M6,整机独享,¥999/月起,联系 Telegram @singatao。
查看方案与费用 · 帮助中心

返回首页 · 更多文章

Telegram 客服