Claude Code 总是请求权限?不用 --dangerously-skip-permissions 也能解决
第四十次批准 npm test,只是徒增干扰。Claude Code 提供了屏蔽无聊提示、保留危险提示所需的一切,只是这些功能分散在三个文件和六种模式里。
简短回答
把你总会批准的命令放进 permissions.allow(例如 Bash(npm run *)),把必须拦下的命令放进 ask 或 deny,再根据任务选择权限模式:大量编辑用 acceptEdits,日常工作用 auto,只读浏览用 plan。规则按 deny → ask → allow 的顺序检查,因此 deny 永远无法被覆盖。用 /permissions 查看每条规则的来源。--dangerously-skip-permissions 只留给用完即弃的容器。
Claude Code 为什么总是询问
在默认模式(CLI 中标为 Manual)下,Claude Code 首次使用每个工具时都会提示,并且对每条尚未获准运行的 shell 命令都会再次询问。这个提示让你有机会拦下错误的 rm 或误操作的 git push,因此值得保留。问题在于,智能体在一次会话中做的上百件无害小事也都会触发它。
是否出现提示由三件事决定:设置文件中的规则、当前所处的权限模式,以及你之前选择“Yes, and don’t ask again”(是,且不再询问)时给出的答复。要消除干扰,三者都需要调整。
Claude Code v2.1.283 及更高版本在所有套餐和服务商下,都会以 auto 模式启动交互式终端和 VS Code 会话。在 auto 模式下,后台分类器会将命令和网络请求与你的要求进行比对,而不会为常规操作弹出提示。如果你仍然每一步都看到提示,请查看状态栏:显示“⏸ manual mode on”表示你处于默认模式。
allow、ask 和 deny 规则
规则位于设置文件的 permissions 下。以下示例直接取自 Anthropic 的设置参考:
allow:直接运行,不询问。ask:始终询问,即使在原本会自动批准的模式下也是如此。deny:永不运行。
关键在于顺序:先 deny,再 ask,最后 allow。第一条匹配的规则生效,规则写得多具体都不会改变这个顺序。 allow 规则无法在 deny 规则中开出例外;只要某个工具在任一层级被拒绝,其他层级都无法允许它。规则由 Claude Code 本身强制执行,而不是由模型执行,所以在 CLAUDE.md 中写“永远不要 push”与 deny 规则的效果并不相同。
如何编写规则
| 规则 | 匹配内容 |
|---|---|
Bash(npm run *) | npm run build、npm run test --watch,但不包括 npm install |
Bash(git log *) | 仅匹配 git log …。对比 Bash(git *),后者允许所有 git 命令。 |
Bash(ls:*) | 等同于 Bash(ls *)::* 是末尾通配符的另一种写法 |
Read(./.env) | 读取该文件。Read 和 Edit 规则使用 gitignore 模式 |
Edit(//Users/alice/notes/**) | 绝对路径。开头只有一个 / 时表示相对于设置文件的路径,因此绝对路径需要写成 // |
WebFetch(domain:example.com) | 仅匹配 example.com。如需包含子域名,请添加 WebFetch(domain:*.example.com) |
mcp__github__* | github MCP 服务器的所有工具。mcp__ 后带括号的规则会被跳过 |
在 Windows 上,PowerShell 规则的写法与 Bash 规则相同。
该用哪个设置文件
| 作用域 | 文件 | 用途 |
|---|---|---|
| 用户 | ~/.claude/settings.json(Windows:%USERPROFILE%\.claude\settings.json) | 你自己的习惯,适用于所有项目 |
| 项目(共享) | .claude/settings.json | 全团队都应遵循的规则(提交到仓库) |
| 项目(本地) | .claude/settings.local.json | 你在某个仓库中的个人规则(不提交) |
| 托管 | managed-settings.json 及其他托管来源 | 公司策略;任何设置都无法覆盖 |
优先级从高到低:托管、命令行、本地项目、共享项目、用户。permissions.allow 等列表类键会在各文件之间合并,而不是相互替换。有两个细节容易让人踩坑:
- 设置文件是严格的 JSON:一个
//注释或一个末尾逗号就会造成语法错误,整个文件都会被忽略。 - 共享项目文件中的 allow 规则要等每位团队成员都信任该文件夹后才会生效。deny 和 ask 规则则立即生效。
大多数修改无需重启即可应用到当前会话,包括 permissions 和 hooks。要查看实际加载了什么,运行 /status(看 Setting sources 一行)或 /permissions,后者会列出每条规则及其来源文件。
“Yes, and don’t ask again”实际保存了什么
在提示中选择“不再询问”时,Claude Code 会替你在 git 仓库根目录的 .claude/settings.local.json 中写入一条规则。它的有效期取决于工具:
| 工具 | 记住的范围 |
|---|---|
| Bash 命令 | 永久,按仓库和命令记录 |
| 文件编辑 | 到会话结束为止 |
| WebFetch | 永久,按仓库和域名记录 |
所以,如果 Claude 每次新会话都要求编辑文件的权限,这是设计使然:文件编辑的批准只在本次会话有效。请改用 acceptEdits 模式或 Edit(...) allow 规则。如果某条命令在选择“不再询问”后仍然询问,请检查项目文件或托管文件中是否有 ask 规则。你本地文件中的 allow 规则优先级不比它高。
权限模式及适用场景
| 模式 | 作用 | 适用场景 |
|---|---|---|
default(Manual) | 首次使用每个工具时提示 | 不熟悉的仓库、有风险的工作 |
acceptEdits | 接受文件编辑,不再询问 | 之后会在 git 中审查的大型重构 |
plan | 只读取和规划,不做任何更改 | 探索代码库、设计改动方案 |
auto | 没有常规提示;分类器会先检查命令和网络请求 | 日常工作 |
dontAsk | 不提示 | 脚本和自动化 |
bypassPermissions | 跳过提示,包括对 .git 和 .claude 的写入 | 仅限隔离的容器或虚拟机 |
按 Shift+Tab 切换模式。从 auto 开始,第一次按下会切换到 default,之后依次为 default → acceptEdits → plan。用 permissions.defaultMode 设置启动模式;注意 auto 和 bypassPermissions 只能在用户设置或托管设置中生效,在项目文件中无效。
有些操作在任何模式下(包括 bypass)都会提示,例如:显式的 ask 规则、Claude 向你提出的问题,以及针对关键路径的 rm。管理员可以将 permissions.disableBypassPermissionsMode 或 permissions.disableAutoMode 设为 "disable" 来关闭有风险的模式。
关于 --dangerously-skip-permissions
--dangerously-skip-permissions 等同于 --permission-mode bypassPermissions。Anthropic 的文档说得很直白:只在隔离环境中使用它,例如没有互联网访问的容器、虚拟机或开发容器。在 Linux 和 macOS 上它拒绝以 root 身份运行;一旦你接受警告,它会在用户设置中写入 skipDangerousModePermissionPrompt。
如果你真正想要的是“别再问无聊的事”,auto 模式加上几条 allow 规则就能做到,而且不必放弃那些真正重要的提示。
沙盒:更少的提示,外加一道安全网
Claude Code 可以在沙盒中运行 shell 命令。沙盒默认关闭;用 /sandbox 或 sandbox.enabled: true 开启。一种沙盒模式会自动批准在沙盒中运行的命令,另一种仍会询问。沙盒只覆盖 shell 命令:文件工具、MCP 服务器和 hook 都在沙盒之外运行。
沙盒可在 macOS、Linux 和 WSL2 上运行。在原生 Windows 上沙盒无法运行,命令会在没有沙盒的情况下执行。这也是在 Windows 上保留一份简短 ask 列表的另一个理由。
一套可行的配置
下面是 JavaScript 项目的一个合理起点。请根据你的技术栈调整命令:
- 先建立一份包含只读命令和测试命令的允许列表。
- 把所有会离开你本机的操作(push、publish、deploy)放进
ask。 - 直接拒绝访问机密信息。
- 在 auto 或 acceptEdits 模式下工作,探索代码时切换到 plan 模式。
- 每隔几天打开
.claude/settings.local.json,清理“不再询问”添加的规则。
剩下的提示出现在错误的位置时
调整之后,你应该只会被问到真正需要你做决定的事情。剩下的问题是提示出现的位置:在浏览器后面的某个终端标签页里,智能体可能要等上二十分钟你才会注意到。
Pet Island 把这些问题移到屏幕顶部的一座小岛上。当 Claude Code 需要权限时,请求会连同命令或 diff 一起显示在那里,你无需切换窗口就能允许、拒绝或始终允许。Claude Code 的提问和计划也能在小岛上处理;如果小岛已关闭,Claude Code 会直接回退到在终端中询问。
常见问题
如何让 Claude Code 不再为每条命令请求权限?
把你信任的命令添加到 ~/.claude/settings.json 的 permissions.allow 中,例如 "Bash(npm run *)",并使用 auto 或 acceptEdits 模式。把有风险的命令保留在 permissions.ask 中,让它们仍然会被拦下。
我已经选了“不再询问”,为什么 Claude Code 还会为文件编辑再次询问?
文件编辑的批准只持续到会话结束。如果希望跨会话批准编辑,请使用 acceptEdits 模式或 Edit(...) allow 规则。
allow 规则能覆盖 deny 规则吗?
不能。规则按 deny、ask、allow 的顺序检查,第一条匹配的规则生效。在任一层级被拒绝的工具,无法在其他地方被允许。
--dangerously-skip-permissions 安全吗?
Anthropic 只建议在隔离环境中使用它,例如没有互联网访问的容器或虚拟机。它还会跳过对 .git 和 .claude 写入的提示。
“Yes, and don’t ask again”把规则保存在哪里?
保存在 git 仓库根目录的 .claude/settings.local.json 中。
Claude Code 的沙盒在 Windows 上能用吗?
原生 Windows 上不能用;命令在那里会在没有沙盒的情况下运行。沙盒可在 macOS、Linux 和 WSL2 上运行。
参考来源
本页的每项设置和行为都已于 2026年10月26日 对照以下页面核实。智能体更新很快;如有不符,以官方页面为准。
- Claude Code 文档:Configure permissions
- Claude Code 文档:Permission modes
- Claude Code 文档:Settings
- Claude Code 文档:Settings reference
- Claude Code 文档:Sandboxing