Skip to content

权限模型

Claude Code 想帮你干活,前提是它得先问过你能不能。权限模型就是这套问答规则。这一节把四种模式、规则语法、危险选项一次讲透。

为什么需要权限

Claude Code 手里握着一批本地工具,Bash、Read、Write、Edit、WebFetch,每一个都能对你的机器产生真实影响。默认所有工具在触发时都会跳出一个确认框,等你按 y 或 n。这个默认策略最安全,但如果你在一个安全项目里连点五十下 y,工作节奏就断了。所以需要有一套让你按场景放宽或收紧的机制。

四种模式

default(默认询问) 每次调用工具都会弹确认框。你按 y 通过一次,按 a 加入本会话白名单,按 n 拒绝。适合新项目、陌生代码、生产环境的排查会话。

acceptEdits(自动通过文件编辑)EditWriteNotebookEdit 这些文件写入类操作自动放行,其余工具(Bash、WebFetch 等)仍然要问。适合你已经知道 Claude 要改哪些文件、就是想让它连续多改几个的场景,比如批量重构。

plan(只出方案不动手) Claude 只做只读操作,Read、Grep、Glob 都能用,但任何写入、执行、外部调用一律禁用,最终产出一份计划让你 review。适合让 Claude 帮你想清楚一件复杂任务应该怎么拆步、影响哪些文件、有什么风险,等你点头再切回 default 让它执行。

bypassPermissions(全放开) 所有工具无需确认直接跑。风险最高,只在你完全信任当前任务且清楚会发生什么时用。也是 --dangerously-skip-permissions 命令行标志启用的模式。

运行时切换模式

三种方式,怎么方便怎么来。

快捷键 Shift+Tab:一按就在四种模式间循环,界面下方会显示当前所在。这是最快的方式。

Slash 命令 /permissions:打开权限管理面板,除了模式还能看当前 allow / deny 规则,也能现场加一条。

启动参数:跑 claude 时直接指定,比如:

bash
claude --permission-mode plan

或者在 settings.json 里写死默认值:

json
{
  "permissions": {
    "defaultMode": "acceptEdits"
  }
}

规则语法

除了大模式,Claude Code 还允许你写细粒度规则。规则格式是 工具名(参数模式),放在 permissions.allowpermissions.deny 数组里。

工具名

BashReadWriteEditWebFetchGrepGlobNotebookEdit 等。写工具名不带参数,等价于对该工具的所有调用生效。

参数模式

参数用 glob 或前缀写法。

Bash 命令:写要匹配的命令前缀,末尾用 :* 表示任意参数。

json
"Bash(git status:*)"
"Bash(npm test:*)"
"Bash(git push:*)"

Bash(git status:*) 匹配所有以 git status 开头的命令,不管后面跟什么参数。想更严格就把 :* 换成具体参数,比如 Bash(git push origin main)

Read / Write / Edit 文件路径:写 glob,** 代表任意层目录。

json
"Read(**)"
"Read(src/**/*.ts)"
"Write(docs/**)"
"Edit(**/*.md)"

Read(**) 是允许读所有文件,Read(**/.env) 是明确匹配所有 .env 文件。

WebFetch 域名:用 URL 模式匹配。

json
"WebFetch(https://*.anthropic.com/**)"
"WebFetch(https://api.github.com/**)"

只允许访问指定域名的场景很常见,避免 Claude 把内部信息拉到未知外部服务。

allow 与 deny

allow 是白名单,命中的操作跳过确认直接执行。deny 是黑名单,命中的操作直接拒绝,连问都不问。

deny 优先级高于 allow,两者同时命中时以 deny 为准。这样你可以先大范围放开,再局部禁掉某几条高危动作,例如:

json
{
  "permissions": {
    "allow": [
      "Read(**)",
      "Bash(git:*)"
    ],
    "deny": [
      "Read(**/.env)",
      "Read(**/credentials/**)",
      "Bash(git push --force:*)",
      "Bash(git reset --hard:*)"
    ]
  }
}

上面这段的效果是允许 Claude 读任意文件、跑任意 git 子命令,但 .envcredentials/ 目录读不到,git push --forcegit reset --hard 也跑不了。

一份日常项目的推荐配置

给你一份适合大多数 Web 项目的起手式,写到 .claude/settings.json 里就能用:

json
{
  "permissions": {
    "defaultMode": "default",
    "allow": [
      "Read(**)",
      "Grep(**)",
      "Glob(**)",
      "Bash(git status:*)",
      "Bash(git diff:*)",
      "Bash(git log:*)",
      "Bash(npm test:*)",
      "Bash(npm run lint:*)",
      "Bash(npm run build:*)"
    ],
    "deny": [
      "Read(**/.env)",
      "Read(**/.env.*)",
      "Read(**/secrets/**)",
      "Read(**/credentials/**)",
      "Bash(rm -rf:*)",
      "Bash(git push --force:*)",
      "Bash(git push --force-with-lease:*)",
      "Bash(git reset --hard:*)"
    ]
  }
}

读代码、看 diff、跑测试、build 都自动放行,敏感文件和高危 git 命令直接拉黑。剩下的(Edit、Write、WebFetch、其他 Bash)还是走 default 询问模式。

危险选项:--dangerously-skip-permissions

启动时加这个标志,直接进入 bypassPermissions 模式:

bash
claude --dangerously-skip-permissions

字面意思,跳过所有权限确认。所有 Bash、所有写入、所有网络请求都直接执行。名字前缀 dangerously- 是 Anthropic 官方在给你打预防针。

什么时候可以用

  • 一次性、无副作用、跑完就走的隔离环境。比如 CI 里的 sandbox 容器、临时 VM、Docker 里的自动化流水线。
  • 你已经把 workspace 挂成只读、或者做了快照可回滚,跑完能一键重置。

什么时候不该用

  • 你自己的开发机、公司电脑、装了任何敏感凭据的机器。
  • 有生产数据库连接、部署密钥、企业内网 VPN 的环境。
  • 权限逻辑没搞清楚时想着先跳过看看效果。跳过的代价可能是一个 rm -rf 或者一次误 push。
  • 任何和账号资金相关的环境,比如接了付款 API、云账号 root key。

一条红线

如果你正在犹豫要不要开 --dangerously-skip-permissions,答案就是不开。有这一秒犹豫就说明当前环境不够干净。真需要放开时你会毫不犹豫。

排查权限没生效

三个最常见问题:

规则写了但被 deny 覆盖:deny 优先级高,检查 deny 列表里有没有更宽的规则命中你想放行的操作。

规则在错误的层级:项目私有的 settings.local.json 会覆盖项目共享的 settings.json,用 /status 看当前生效的是哪一层。

规则语法写错Bash(git push)Bash(git push:*) 不一样,前者只匹配裸命令,后者匹配任何 git push 开头的调用。用 /permissions 查看解析后的规则,比对是不是你想的那样。

一句话总结

先立墙、再开门。默认模式 + 敏感文件 deny + 明确白名单,是安全和效率的平衡点。真需要撒手时切 acceptEdits 就够了,别轻易碰 bypassPermissions,更别把 --dangerously-skip-permissions 当默认启动参数。

至此本章四节结束,Slash、键位、配置、权限四把钥匙都在你手里了。下一章我们进项目工作流,看看真实项目里怎么把这些能力串起来用。

本教程为社区中文学习整理,非官方发布。Claude Code 属于 Anthropic。