权限怎么配:allow、ask、deny,再加一层沙箱
CLAUDE.md 只能影响模型「想做什么」。真正拦不拦,靠权限规则、权限模式,以及 Bash 的沙箱。分界见 CLAUDE.md 管倾向,Hooks 才是铁律。Auto mode 分类器另说,见 Auto mode 配置。
三种规则,顺序固定
在 /permissions 或 settings.json 的 permissions 里:
allow:匹配到就不问ask:每次确认deny:禁止
求值顺序永远是 deny → ask → allow。更窄的 allow 盖不过更宽的 deny。裸工具名如 Bash 作 deny 时,工具会从模型上下文里拿掉;带范围的如 Bash(rm *) 仍留着工具,只拦匹配调用。
{
"permissions": {
"allow": [
"Bash(npm test *)",
"Bash(git commit *)"
],
"ask": [
"Bash(git push *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Bash(git push *)"
]
}
}路径用 gitignore 风格。绝对路径写 //Users/... 或 ~/...。Read deny 也会挡住同路径上的 Edit / Write(版本门槛以文档为准)。NotebookEdit 要另写 Edit deny。
Bash 规则按整段命令匹配,* 可出现在任意位置。safe && other 要每一段各自匹配。timeout、time 一类包装会先剥掉再匹配;npx、docker exec 不在内置剥离列表里,别指望 Bash(npm test *) 盖住 docker exec ... npm test。
网络别指望 Bash(curl http://github.com/*) 这种前缀。更稳:deny 掉宽泛的 curl / wget,再用 WebFetch(domain:...),或挂 PreToolUse 钩子验 URL。
权限模式
| 模式 | 行为 |
|---|---|
default / Manual | 首次用工具时询问 |
acceptEdits | 自动接受文件编辑和常见文件系统命令 |
plan | 先读后方案,不改源码;可用时分类器可批只读命令 |
auto | 分类器代批,仍受 deny / ask 约束 |
dontAsk | 未预批的一律拒绝 |
bypassPermissions | 几乎跳过询问,含部分受保护路径 |
计划模式启动:
claude --permission-mode plan会话里 Shift+Tab 切到 ⏸ plan mode on。默认模式可用 defaultMode 写进设置。组织可用 permissions.disableBypassPermissionsMode、permissions.disableAutoMode 锁死危险模式。
bypassPermissions 只适合容器或可丢弃环境,不要当日常默认。
沙箱和权限是两层
权限管「Claude Code 允不允许发起」。沙箱是 OS 级,限制 Bash 及其子进程的文件系统和网络。启用沙箱且 autoAllowBashIfSandboxed 保持默认时,沙箱内的 Bash 可能不再为「裸 Bash ask」弹窗;内容级 ask(如 Bash(git push *))和 deny 仍生效。计划模式里行为更紧,以当前文档为准。
读写工作目录外的文件,可用 --add-dir、/add-dir 或 additionalDirectories。设 permissions.blockReadsOutsideWorkingDirectories 可在各模式下挡住越界读。
信任、Hooks、工作目录
项目 .claude/settings.json 里的 allow 和 additionalDirectories,要你信任该工作区后才生效。deny 和 ask 马上生效。仓库里提交的 local 文件若被当成仓库供给,也会走信任。
PreToolUse 钩子能在运行时拒绝或强制询问,但盖不过 deny / ask 规则;退出码 2 的拦截可以在 allow 之前挡住。Hooks 结构见已有 Hooks 文。
从子目录或 worktree 点「以后都允许」时,较新版本把规则写到仓库根的 .claude/settings.local.json,整仓共用。
最小起步:每个项目 deny 掉 .env 和密钥目录,危险命令进 deny 或 ask,默认模式先跑熟,再按需放开;高风险自动化放进沙箱或临时容器。