Claude Code 学习站
Mingyu's Library

学习站 / 实战 Tip / E · 配置与选型

权限:从每步点同意到不打断

每个命令都要点一次「同意」很快就烦了——但一步跳到全放行又危险。这条 Tip 给出官方支持的渐进放权路径和不能碰的底线。

Claude Code 的权限体系分两层:权限模式(mode)定基调,allow/ask/deny 规则做细粒度覆盖。放权的正确姿势是沿着这两层逐级往上走,而不是直接开 bypassPermissions

一句话结论

结论 渐进走四步:先在默认模式里用「Yes, don't ask again」攒 allowlist → 切 acceptEdits 免编辑确认 → 升 auto mode 让分类器做背景安全审查;同时用 ask 规则给 git push 留人工检查点、用 deny 规则挡敏感文件。bypassPermissions 只在隔离的容器/VM 里用,永远别在本机日常开。

做法步骤

  1. 从默认模式开始,让批准自动沉淀成规则。官方默认模式(界面里叫 Manual)只有读取免确认,Bash 命令首次使用要批准。批准时选「Yes, don't ask again」,Bash 规则会永久存进仓库根部的 .claude/settings.local.json,整个仓库(含子目录和 worktree)的后续会话都生效;批准复合命令(如 git status && npm test)时会按子命令拆开保存。文件编辑的批准只持续到会话结束,不落盘。用一两天,常用命令就攒出一份真实的 allowlist。
  2. /permissions 整理规则。官方/permissions 列出所有 allow/ask/deny 规则和来源文件。求值顺序固定为 deny → ask → allow,先匹配先赢,具体度不影响顺序(所以宽 deny 会压过窄 allow)。手写规则注意通配符语义:Bash(npm run *) 匹配 npm run 开头的命令;Bash(ls *) 里的空格是词边界,匹配 ls -la 但不匹配 lsof。想团队共享就把规则挪进 .claude/settings.json 提交。
  3. acceptEdits,改用事后审。官方会话内按 Shift+Tab 循环切换模式。acceptEdits 自动接受工作目录内的文件编辑和常见文件系统命令(mkdirtouchmvcpsed 等),其余 Bash 命令照常询问。适合「改完我用 git diff 统一看」的工作流。想固定为默认,在 ~/.claude/settings.json"permissions": {"defaultMode": "acceptEdits"}
  4. 升 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
  5. 守住安全底线——哪些别放行。官方官方明确的几条: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/rmfind -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 的求值顺序
   会怎么影响这份配置。

来源与最后核实日期