Claude Code 总是请求权限?不用 --dangerously-skip-permissions 也能解决

第四十次批准 npm test,只是徒增干扰。Claude Code 提供了屏蔽无聊提示、保留危险提示所需的一切,只是这些功能分散在三个文件和六种模式里。

作者:Aslan,Pet Island 团队 · 更新于 2026年10月26日 · 阅读时长 5 分钟

简短回答

把你总会批准的命令放进 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 的设置参考:

~/.claude/settings.json复制
{
"permissions": {
"allow": ["Bash(npm run *)"],
"ask": ["Bash(git push *)"],
"deny": ["Read(./.env)"],
"defaultMode": "acceptEdits"
}
}
  • 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 项目的一个合理起点。请根据你的技术栈调整命令:

~/.claude/settings.json复制
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(npx tsc *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)"
],
"ask": [
"Bash(git push *)",
"Bash(npm publish *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)"
]
}
}
  1. 先建立一份包含只读命令和测试命令的允许列表。
  2. 把所有会离开你本机的操作(push、publish、deploy)放进 ask。
  3. 直接拒绝访问机密信息。
  4. 在 auto 或 acceptEdits 模式下工作,探索代码时切换到 plan 模式。
  5. 每隔几天打开 .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日 对照以下页面核实。智能体更新很快;如有不符,以官方页面为准。

继续阅读

在屏幕顶部回应每一个智能体。

Windows 和 Mac · 免费试用 7 天,之后一次性支付 8.99 美元 · 每笔销售拿出 1 美元为流浪动物提供食物

免费试用 Pet Island