一个常见的写法漏洞
@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 *) 效果相同。
更稳的写法
- 按程序写,不按参数写:把
Bash(rm *)放进 ask(或 deny),它能覆盖所有以rm开头的命令,不管参数怎么排列。注意空格:文档说明结尾*前的空格是规则的一部分,Bash(rm*)会连带匹配别的以 rm 开头的程序名。 - deny / ask 规则能跨过前置变量:文档举例,deny 里的
Bash(rm *)仍会匹配FOO=bar rm -rf tmp/。 - 组合命令会拆开逐段检查:
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。
