深色模式
Claude Code 权限模式
概述
Claude Code 的权限模式,本质上是在“效率”和“监督”之间选挡位。挡位越保守,Claude 每做一步越容易先询问;挡位越激进,人工确认越少,但也更依赖环境隔离、规则配置和使用者判断。
本文基于 2026 年 4 月 14 日查阅的官方文档整理,重点讲清六种模式的差异:default、acceptEdits、plan、auto、dontAsk、bypassPermissions,以及它们分别适合什么场景。
一张表看区别
| 模式 | 无需询问即可做什么 | 仍会询问或限制什么 | 适合什么场景 |
|---|---|---|---|
default | 读取文件 | 文件编辑、命令执行等需要人工确认 | 初次使用、敏感仓库、默认起步 |
acceptEdits | 读取和编辑文件,受保护目录除外 | 命令执行、网络请求、受保护目录写入仍会提示 | 日常编码、边改边审 |
plan | 读取文件 | 不能改源码;命令执行仍按默认方式审批 | 先调研、先出方案、复杂重构前摸底 |
auto | 大多数操作都可直接执行 | 后台分类器会拦截高风险或偏题操作;反复被拦截会回退到人工审批 | 长任务、批量修改、减少频繁确认 |
dontAsk | 仅预先批准过的工具和命令 | 其他操作直接拒绝,不弹确认框 | CI、受限环境、严格白名单 |
bypassPermissions | 几乎所有操作 | 只剩受保护目录写入仍会提示;没有安全检查 | 隔离容器、VM、一次性高自主任务 |
这六种模式里,最容易混淆的通常是四组:default 和 acceptEdits,plan 和 default,auto 和 bypassPermissions,dontAsk 和 bypassPermissions。
最容易混淆的区别
default 和 acceptEdits
这两个模式最像,也最容易在日常使用里来回切。
default 更像“标准人工审批模式”:Claude 可以自由读文件,但改文件、跑命令这类动作要你点头。它适合刚接触一个仓库,或者任务里包含发布、迁移、脚本执行这类敏感动作。
acceptEdits 只放宽了一件事:允许 Claude 直接改工作区文件。命令执行、网络访问、受保护目录写入,仍然要审批。
所以它们的核心区别不是“Claude 会不会更聪明”,而是“文件编辑要不要逐次确认”。如果当前任务只是改代码、修文案、调配置,而且你本来就会 review diff,acceptEdits 往往比 default 顺手很多。
plan 和 default
很多人会把 plan 理解成“更保守的 default”,但准确说,它是“禁止落地修改的分析模式”。
按 2026 年 4 月 14 日查阅的官方 permission-modes 页面,plan 模式下 Claude 可以读文件,也可以运行 shell 命令做探索,但这些命令仍然按默认权限流程审批;真正被禁止的是源码编辑。
这意味着 plan 的价值不在于减少权限弹窗,而在于把任务拆成两段:
- 第一段先读代码、跑搜索、整理方案。
- 第二段等方案确认后,再切到
default、acceptEdits或auto落地。
复杂重构、陌生代码库排查、需要先估算影响面的任务,plan 都很合适。
auto 和 bypassPermissions
这两个模式看起来都像“少弹窗”,但安全边界差很多。
auto 不是简单地把所有权限都放开。官方文档写得很明确:它会在后台用分类器检查操作是否和当前任务一致,默认还会阻止生产部署、大规模删除、强推到 main、curl | bash 这类高风险动作。它比手动逐步审批更省事,但仍然保留了一层安全护栏。
bypassPermissions 则是直接跳过权限提示和安全检查。除了少数受保护目录的写入还会提示,其余动作基本是立刻执行。官方把这个模式的建议场景写得很直白:容器、VM、无网络 devcontainer 这类隔离环境。日常本机开发把它当默认模式,用起来很爽,出事也会很直接。
如果任务只是长、杂、步骤多,优先考虑 auto;如果环境已经被严格隔离,而且你就是要让 Claude 放开手跑,再考虑 bypassPermissions。
dontAsk 和 bypassPermissions
这两个模式方向相反。
dontAsk 是“只允许白名单内动作”。凡是不在 permissions.allow 或 /permissions 允许规则里的操作,一律拒绝;即使你给某个工具配了 ask 规则,在这个模式下也不会弹窗,而是直接拒绝。
bypassPermissions 是“除了极少数保护项,基本都放行”。
一个适合锁死环境,一个适合彻底放权,别混着理解。
受保护路径始终是例外
无论使用哪种模式,官方都把一批路径列为受保护对象。目录里最常见的是 .git、.vscode、.idea、.husky 和 .claude;文件里还包括 .gitconfig、.gitmodules、shell 配置文件、.mcp.json、.claude.json 等。
原因也不复杂:这些位置一旦被误改,影响的往往不是某个业务文件,而是仓库状态、终端环境、MCP 接入、编辑器行为,或者 Claude 自己的配置。
官方给了四个例外目录:.claude/commands、.claude/agents、.claude/skills、.claude/worktrees。这些目录本来就是 Claude Code 高频读写的位置,所以没有被放进这层强保护里。
这也是为什么 acceptEdits 和 bypassPermissions 都不是“绝对无提示”。涉及这些受保护路径时,可提示的模式会继续要求确认,dontAsk 这类无提示模式则会直接拒绝。
按场景选择就够了
如果不想背定义,直接按任务类型选通常更省事。
- 首次接触仓库,或者任务里可能碰到发布、迁移、删除操作,用
default。 - 已经确认目标,只想让 Claude 快速改代码,再自己看 diff,用
acceptEdits。 - 需求比较大,想先出改动计划、先看影响面,用
plan。 - 任务很长,改动很多,反复确认已经影响节奏,用
auto。 - 在 CI、脚本化流水线、受限执行环境里,只允许一小部分预定义操作,用
dontAsk。 - 在隔离容器、VM、临时沙箱里做高自主批处理,用
bypassPermissions。
日常本地开发里,一个很实用的顺序是:先 plan,再 acceptEdits,必要时才切 auto。bypassPermissions 不建议进常用肌肉记忆。
怎么切换权限模式
CLI 里最直接的方式是启动时指定:
sh
claude --permission-mode plan
claude --permission-mode acceptEdits
claude --permission-mode dontAsk
claude --permission-mode bypassPermissions权限模式是客户端控制项,不是和 Claude 说一句“这次别问我”就会自动切过去。
auto 需要显式启用:
sh
claude --enable-auto-mode非交互式调用也可以带同样的参数:
sh
claude -p "review this diff" --permission-mode acceptEdits交互会话里,Shift+Tab 可以在权限模式之间循环切换。需要注意两点:
auto只有在启动时启用后,才会出现在循环里。dontAsk不会出现在Shift+Tab循环里。
如果希望某种模式成为默认值,可以在 settings.json 里设置 permissions.defaultMode:
json
{
"permissions": {
"defaultMode": "acceptEdits"
}
}截至 2026 年 4 月 14 日,auto 仍属于研究预览,并且需要 Team、Enterprise 或 API 计划,以及 Claude Sonnet 4.6 或 Claude Opus 4.6;在 Haiku、Claude 3 系列和第三方提供商上不可用。
