第 4 章 / 共 12 章
权限模式:让它敢动手,又不闯祸
4.1 一个必须先想清楚的问题
“它会不会未经同意就把我的代码改坏、把命令跑坏?”
这个担心是合理的,但它藏着一个更实际的问题:如果每一步都要你点确认,一天下来你会点几十次,然后从第十次开始你就不再真的在看内容了——你只是在点”允许”。官方文档直接点破了这个失效模式:到第十次批准的时候,你是在点过去,而不是在审查。
所以权限设计的目标不是”尽可能多地拦”,而是把你的注意力留给真正值得看的那几次。
4.2 五档自主度
Claude Code 提供了一组权限模式,在会话里按 Shift + Tab 循环切换,也可以用 --permission-mode 在启动时指定:
| 模式 | 行为 | 什么时候用 |
|---|---|---|
plan(计划) | 只读探索,不改源文件,产出方案 | 面对不熟悉的代码、多文件改动之前 |
default / Manual(手动) | 改文件、跑命令前逐次询问 | 高风险仓库;你想逐条把关时 |
acceptEdits(接受编辑) | 自动接受文件编辑和常见文件系统命令 | 方向已经确认、进入机械执行阶段 |
auto(自动) | 由一个分类模型在后台审查动作并拦截越界行为 | 日常主力模式(订阅账号的交互式会话默认) |
bypassPermissions(绕过) | 除受保护路径外几乎不再询问 | 仅限隔离容器/虚拟机 |

plan 和 auto 之间来回切,而不是一路爬到顶。关于最顶上那一档,需要把官方原话说清楚:--dangerously-skip-permissions 就等于 --permission-mode bypassPermissions。官方的使用条件是”只在容器、虚拟机或无外网的开发容器这类隔离环境里使用,确保 Claude Code 无法损害你的宿主机”,并且明确说明它对提示注入和意外操作不提供任何保护。在 Linux/macOS 上以 root/sudo 身份运行时它会被直接拒绝。
如果你的动机只是”提示太多太烦”,正确答案是 auto 模式加上一份权限清单,而不是这个开关。
4.3 工作目录就是第一道边界
在手动模式下,Claude Code 启动时是只读的,并且只能写它启动所在的目录及其子目录。这条边界比大多数人以为的更重要:它意味着”在哪里启动”本身就是一个安全决策。
需要跨目录时,用参数显式扩展,而不是干脆去家目录启动:
claude --add-dir ../shared-types
还有一个容易被忽略的机制:目录信任。第一次在一个新仓库里启动时,会弹出信任确认。在你确认之前,这个项目的部分配置不会生效。这道门的存在,是因为项目里的钩子、环境变量等配置是会执行代码的——你 clone 一个陌生仓库然后直接在里面启动,等于同意运行它自带的配置。
4.4 用规则清单代替逐次点击
权限规则分三类,按 deny → ask → allow 的顺序匹配,第一条命中的生效:
allow:直接放行,不再询问;ask:每次都问;deny:直接拒绝。
规则写在配置文件里。最常用的位置是项目下的 .claude/settings.local.json(个人本地、通常加进 .gitignore)和 .claude/settings.json(团队共享、提交进仓库)。
一份适合大多数 Web 项目的起步配置:
{
"permissions": {
"allow": [
"Bash(npm run test:*)",
"Bash(npm run lint)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git add *)",
"Read(./src/**)"
],
"ask": [
"Bash(npm install *)"
],
"deny": [
"Bash(git push *)",
"Bash(rm -rf *)",
"Read(./.env)",
"Read(./secrets/**)"
]
}
}
几点说明:
- 括号里的模式用
*通配,文件路径用 gitignore 风格的写法,**可以跨目录; - 把读取敏感文件也写进
deny,不要只防写不防读; git push放进deny是个务实的默认值:你随时可以自己推,但你不希望它在你没看 diff 之前推。
在会话里可以用 /permissions 直接查看和调整当前生效的规则。当你在提示框里点”允许,并且以后不要再问”时,命令类的规则会被持久化到当前仓库的配置里;文件类的批准通常只在本次会话内有效。
4.5 配置从哪里来:五级优先级
当行为和你预期不符时,多半是配置层级搞混了。从高到低:
- 组织下发的管理策略(由 IT 部署,个人无法覆盖)
- 启动时的命令行参数
.claude/settings.local.json(项目本地,不进版本库).claude/settings.json(项目共享,进版本库)~/.claude/settings.json(个人全局,作用于所有项目)
实际用法很简单:团队共同规矩写第 4 层,个人偏好写第 5 层,机器特有的东西写第 3 层。
4.6 常见坑
4.7 本章练习与检查点
你现在的成果:你有了一份写下来的边界,而不是靠每次点击临时决定。从这里开始,你可以放心地把自动化档位往上调一格。