Claude Code 的权限体系分两层:权限模式(mode)定基调,allow/ask/deny 规则做细粒度覆盖。放权的正确姿势是沿着这两层逐级往上走,而不是直接开 bypassPermissions。
一句话结论
结论
渐进走四步:先在默认模式里用「Yes, don't ask again」攒 allowlist → 切
acceptEdits 免编辑确认 → 升 auto mode 让分类器做背景安全审查;同时用 ask 规则给 git push 留人工检查点、用 deny 规则挡敏感文件。bypassPermissions 只在隔离的容器/VM 里用,永远别在本机日常开。
做法步骤
- 从默认模式开始,让批准自动沉淀成规则。官方默认模式(界面里叫 Manual)只有读取免确认,Bash 命令首次使用要批准。批准时选「Yes, don't ask again」,Bash 规则会永久存进仓库根部的
.claude/settings.local.json,整个仓库(含子目录和 worktree)的后续会话都生效;批准复合命令(如git status && npm test)时会按子命令拆开保存。文件编辑的批准只持续到会话结束,不落盘。用一两天,常用命令就攒出一份真实的 allowlist。 - 用
/permissions整理规则。官方/permissions列出所有 allow/ask/deny 规则和来源文件。求值顺序固定为 deny → ask → allow,先匹配先赢,具体度不影响顺序(所以宽 deny 会压过窄 allow)。手写规则注意通配符语义:Bash(npm run *)匹配npm run开头的命令;Bash(ls *)里的空格是词边界,匹配ls -la但不匹配lsof。想团队共享就把规则挪进.claude/settings.json提交。 - 切
acceptEdits,改用事后审。官方会话内按Shift+Tab循环切换模式。acceptEdits自动接受工作目录内的文件编辑和常见文件系统命令(mkdir、touch、mv、cp、sed等),其余 Bash 命令照常询问。适合「改完我用git diff统一看」的工作流。想固定为默认,在~/.claude/settings.json写"permissions": {"defaultMode": "acceptEdits"}。 - 升 auto mode:不打断但有兜底。官方auto mode 下一切自动执行,由一个独立分类器模型在后台审查每个动作,默认拦截
curl | bash、force push、生产部署、把密钥送出仓库等高危操作;你在对话里说的边界(如「先别 push」)也会被当作拦截信号。注意两点:进入 auto mode 时,Bash(*)这类授予任意代码执行的宽 allow 规则会被暂时吊销(窄规则如Bash(npm test)保留);explicit ask 规则仍然强制弹确认。auto mode 需要账号满足模型等条件,不满足时Shift+Tab循环里不会出现它。各模式免确认范围对比:模式 免确认范围 适合 default(Manual)只有读取 刚上手、敏感工作 acceptEdits读取 + 文件编辑 + 常见文件系统命令 边改边用 diff 审 plan读取(auto 可用时,分类器批准的命令也放行) 动手前先探索 auto一切,但有分类器背景审查 长任务、减少确认疲劳 dontAsk只有预批准的工具,其余自动拒绝 CI、锁死的脚本环境 bypassPermissions一切,无审查 只用于隔离容器/VM - 守住安全底线——哪些别放行。官方官方明确的几条:
bypassPermissions只在隔离环境用(它连.git、.claude等保护路径的写入都放行,root/sudo 下会拒绝启动);想在不打断的同时保留人工检查点,给推送类动作加 ask 规则,官方配方是"ask": ["Bash(git push *)", "Bash(gh pr create *)"],它在 auto mode 里也强制弹确认;敏感文件加 deny,如Read(.env)、Read(~/.ssh/**)。本站观点另外两条实践建议:别 allow 任何「下载并执行」类命令(curl | bash);记住 Bash 前缀规则匹配的是命令字符串——Bash(rm *)的 deny 挡不住/bin/rm或find -delete,需要硬保证时用 PreToolUse hook 或沙箱(参见 D3 权限模式与沙箱)。还要记住:权限由 Claude Code 强制执行,CLAUDE.md 里写的「不要做 X」只是引导,不是边界。
可直接抄的 prompt
帮我把这个项目的权限配置从「每步确认」升级为「少打断但有底线」:
1. 读 .claude/settings.local.json 里已沉淀的 allow 规则,挑出适合团队共享的
构建/测试/lint 类命令,整理进 .claude/settings.json 的 permissions.allow;
2. 在 permissions.ask 加上 "Bash(git push *)" 和 "Bash(gh pr create *)",
给推送和开 PR 保留人工检查点;
3. 在 permissions.deny 加上读取 .env、secrets 目录和 ~/.ssh 的规则;
4. 不要 allow 任何删除类、下载执行类(curl|bash)或改系统配置的命令;
5. 写完逐条解释每条规则的作用,并告诉我 deny → ask → allow 的求值顺序
会怎么影响这份配置。
来源与最后核实日期
- 官方permissions(规则语法/求值顺序/保存位置/managed settings),抓取于 2026-08-05。
- 官方permission-modes(六种模式/切换方式/auto mode 拦截清单/保护路径),抓取于 2026-08-05。
- 官方auto-mode-config(人工检查点配方/受信基础设施),抓取于 2026-08-05。
- 最后核实:2026-08-05 · volatility:high(auto mode 的可用条件与拦截规则随版本快速演进,版本水位 2.1.222)。