权限与权限模式
用 allow/ask/deny 规则、规则语法、权限模式(Manual、acceptEdits、Plan、Auto、dontAsk、bypassPermissions)和工作目录精细控制 Claude 能做什么。
Claude Code 支持细粒度权限,让你精确指定智能体能做什么和不能做什么。你可以把权限设置提交进版本控制,与组织里的每位开发者共享,每位开发者也可以自行定制。
权限系统
Claude Code 用分层权限系统来平衡能力与安全。下表按工具类型显示 Manual 模式下是否在动作执行前询问:
| 工具类型 | 示例 | 是否需要批准 | 「Yes, and don't ask again」的行为 |
|---|---|---|---|
| 只读 | 文件读取、Grep | 否(在工作目录和额外目录内) | 不适用 |
| Bash 命令 | Shell 执行 | 是,除了一组内置的只读命令 | 按仓库和命令永久生效 |
| 文件修改 | 编辑/写文件 | 是 | 到会话结束 |
| 网页抓取 | WebFetch | 是,除了一组内置的预批准文档域名 | 按仓库和域名永久生效 |
| 网页搜索 | WebSearch | 是 | 按仓库永久生效 |
当你选「Yes, and don't ask again」且批准永久保存时(如 Bash 命令或 WebFetch 域名),Claude Code 会把规则保存到 git 仓库根目录的 .claude/settings.local.json(通过 worktree 解析到主检出)。
在回答权限提示时添加评论:批准或拒绝单个动作时,你可以给 Claude 附一条备注。在大多数权限提示上,移到 Yes 或 No 按 Tab 打开评论框;输入评论后按 Enter 提交答案并附上评论。选 Yes 时 Claude Code 运行动作后把评论发给 Claude;选 No 时评论作为拒绝理由发给 Claude,Claude 继续工作(在主对话的提示上选 No 且不写评论,Claude Code 会停止这一回合)。
管理权限
用 /permissions 查看和管理 Claude Code 的工具权限。对话框列出所有权限规则和每条规则所在的 settings.json 文件。
- Allow 规则让 Claude Code 不经手动批准就使用指定的工具
- Ask 规则在 Claude Code 每次试图使用指定工具时都要求确认
- Deny 规则阻止 Claude Code 使用指定工具
规则按顺序评估:先 deny,再 ask,最后 allow,第一个匹配决定结果,规则的具体程度不改变这个顺序。像 Bash(aws *) 这样宽泛的 deny 规则会阻止所有匹配的调用,包括同时匹配更窄的 allow 规则 Bash(aws s3 ls) 的调用;allow 规则不能从 deny 规则里挖出例外。裸工具名的 deny 规则(如 Bash)会把工具从 Claude 的上下文里完全移除,Claude 根本看不到它。
权限规则由 Claude Code 强制执行,而不是由模型。你的提示或
CLAUDE.md里的指令塑造 Claude 会尝试什么,但不会改变 Claude Code 允许什么。要授予或撤销访问权,用/permissions、这里描述的规则、权限模式或沙箱。
权限模式
权限模式控制 Claude Code 怎样批准工具调用。想更改会话开始时使用的模式,在设置文件里设置 defaultMode。
| 模式 | 无需询问就能运行的 | 适合 |
|---|---|---|
default(界面里叫 Manual) | 只读 | 自己评审每个动作、敏感工作 |
acceptEdits | 读取、文件编辑,以及常见文件系统命令(mkdir、touch、mv、cp 等) | 迭代你正在评审的代码 |
plan | 读取(auto 模式可用时,加上分类器批准的命令) | 在改动之前探索代码库 |
auto | 一切,带后台安全检查 | 长任务、减少提示疲劳 |
dontAsk | 读取和预批准的工具;任何会提示的都被拒绝 | 锁定的 CI 和脚本 |
bypassPermissions | 一切 | 仅限隔离的容器和虚拟机 |
让每个动作都经你审查的模式在 CLI、claude --help、VS Code 和 JetBrains 扩展以及桌面应用里叫 Manual;它的配置值是 default。写入受保护路径的操作永远不会被自动批准(bypassPermissions 模式除外)。
模式设定基线:在其上叠加权限规则来预先批准或阻止特定工具。Deny 规则在每个模式下都会阻止,包括 bypassPermissions。
不被任何模式自动批准的动作(包括 bypassPermissions):被显式 ask 规则匹配的工具;你的组织设为 ask 的连接器工具;需要用户交互的工具(内置的 AskUserQuestion,以及标记了 requiresUserInteraction 的 MCP 工具);针对关键路径的 rm 和 rmdir 删除;跨会话消息的安全保护。
会话以哪种模式开始
在终端启动新会话时,Claude Code 从下面第一个适用的来源取权限模式:
--permission-mode标志,或--dangerously-skip-permissions- 设置文件里的
permissions.defaultMode(auto和bypassPermissions写在.claude/settings.json或.claude/settings.local.json里不生效) - 内置默认值:Claude Code v2.1.283 或更新版本里,交互式终端和 VS Code 会话的内置起始模式是
auto
如果标志、设置文件或内置默认选了 auto 但 auto 模式对该会话不可用,Claude Code 会改以 Manual 启动。想让本机每个终端会话都以 Manual 开始,在 ~/.claude/settings.json 里:
{
"permissions": {
"defaultMode": "default"
}
}切换模式
在 CLI 里按 Shift+Tab 循环切换,或启动时传标志,如 claude --permission-mode acceptEdits。
acceptEdits 模式
让 Claude 在你的工作目录里创建和编辑文件而不提示。状态栏在这个模式下显示 ⏵⏵ accept edits on。除了文件编辑,它还自动批准常见的文件系统 Bash 命令:mkdir、touch、rm、rmdir、mv、cp 和 sed(也包括带 LANG=C 这类安全环境变量或 time 这类进程包装器前缀的情况)。超出范围的路径、写入受保护路径、针对关键路径的删除仍然会提示。想事后在编辑器里或通过 git diff 评审改动、而不是逐个内联批准编辑时用它。
先用计划模式分析再编辑
计划模式让 Claude 研究并提出改动而不做改动:读文件、运行 shell 命令探索、写计划,但不编辑你的源码。按 Shift+Tab 进入,或给单个提示加前缀 /plan,也可以从 CLI 启动:
claude --permission-mode plan计划就绪时,Claude 呈现它并询问如何继续:Yes, and use auto mode(批准并以 auto 模式开始;如果 auto 模式对你的会话不可用,这个选项会写成 Yes, auto-accept edits)、Yes, manually approve edits(批准并逐个评审每次编辑)、No, keep planning(留在计划模式并告诉 Claude 改什么)。批准计划会退出计划模式并切到各批准选项所述的权限模式,Claude 开始编辑。按 Ctrl+G 可以在默认文本编辑器里打开提议的计划,在 Claude 继续前直接编辑。想让计划模式成为项目终端会话的默认,在 .claude/settings.json 里把 defaultMode 设为 plan。
用 auto 模式消除权限提示
auto 模式让 Claude 在没有常规权限提示的情况下执行。一个独立的分类器模型在动作运行前审查,阻止任何超出你请求范围、指向无法识别的基础设施、或看起来由 Claude 读到的恶意内容驱动的动作。显式的 ask 规则仍然会提示。
auto 模式减少权限提示,但不保证安全。用它处理你信任大方向的任务,而不是对敏感操作的评审的替代。
可用性要求:所有套餐;Team 和 Enterprise 上默认可用,管理员可以在托管设置里把 permissions.disableAutoMode 设为 "disable" 来为组织关闭;模型方面,Anthropic API 上需要 Claude Opus 4.6 或更新、Sonnet 4.6 或更新,或 Fable 模型。分类器默认不审查针对关键路径的 rm 和 rmdir 删除(如 rm -rf /、rm -rf ~)。
dontAsk 模式
设置 dontAsk 模式后,Claude Code 自动拒绝每个本来会提示你的工具调用。Claude 仍会运行 Manual 模式下不需要批准的动作(如工作目录内的文件读取和只读 Bash 命令),以及你通过 /permissions 或 permissions.allow 规则预批准的工具。适合锁定的 CI:
claude -p "run the test suite" --permission-mode dontAsk --allowedTools "Bash(npm test)" "Read"bypassPermissions 模式
bypassPermissions 模式禁用权限提示和安全检查,让工具调用立即执行,包括写入受保护路径。只应在没有互联网访问的隔离环境(容器、虚拟机、dev container)里使用,Claude Code 在那里无法损坏你的主机系统。它不能防止提示注入或意外动作。
你无法在没有启用它的情况下启动的会话里进入这个模式。要在启动时启用:permissions.defaultMode: "bypassPermissions",或用启用标志 claude --permission-mode bypassPermissions(--dangerously-skip-permissions 标志等价)。第一次以启用该模式启动交互式会话时,Claude Code 会显示一个警告对话框,要求你接受对无权限检查下所做动作的责任;在 Linux 和 macOS 上,以 root 或 sudo 运行时 Claude Code 拒绝在这个模式下启动。管理员可以通过设置 permissions.disableBypassPermissionsMode 阻止这个模式。云端会话不会遵循你设置文件里的 defaultMode: "bypassPermissions" 或 "dontAsk",所以仓库里提交的设置不能让云端会话以绕过权限模式启动。
常见配置
| 你想要 | 从这里开始 | 需要的隔离 |
|---|---|---|
| 自己评审每个动作 | claude --permission-mode default | 无 |
| 在没有分类器的情况下,以更少提示在本地迭代 | Manual 模式加上 auto-allow 模式的 Bash 沙箱:claude --permission-mode default,然后运行 /sandbox 选 auto-allow | 内置的 Bash 沙箱 |
| 在改动之前先探索 | claude --permission-mode plan | 无 |
| 在 auto 模式下免干预工作 | claude --permission-mode auto | 无;沙箱或容器增加纵深防御 |
| 在 CI 里用精确白名单运行 | claude -p "run the test suite" --permission-mode dontAsk --allowedTools "Bash(npm test)" "Read" | CI 运行器本身提供的 |
| 在容器里完全无人值守地运行 | claude -p "<prompt>" --dangerously-skip-permissions | 必须有:容器、虚拟机或沙箱运行时;Linux 和 macOS 上以非 root 用户运行 |
权限规则语法
规则格式是 Tool 或 Tool(specifier)。specifier 里的括号是字面量,所以含括号的命令或路径无需转义。
匹配工具的所有使用:只写工具名,不带括号。Bash 匹配所有 Bash 命令,WebFetch 匹配所有网页抓取请求,Read 匹配所有文件读取(Bash(*) 等价于 Bash)。
用 specifier 做细粒度控制:Bash(npm run build) 精确匹配命令 npm run build;Read(./.env) 匹配读取当前目录里的 .env 文件;WebFetch(domain:example.com) 匹配对 example.com 的抓取请求。
通配符
Bash 规则里的 * 匹配任意文本,包括空格,所以一条规则可以覆盖一族命令;没有 * 的规则匹配一条精确命令。把 * 放在子命令之后。下面这个配置让 Claude Code 不经询问就运行 npm 脚本和 git 提交,并拒绝以 git push 开头的命令:
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)"
]
}
}* 可以出现在规则的任何位置:开头、中间或结尾。
| 你写 | 匹配 | 不匹配 |
|---|---|---|
Bash(npm run build) | npm run build | npm run build --watch |
Bash(npm run *) | npm run build、npm run test --watch、npm run | npm install |
Bash(git log * main) | git log --oneline main、git log -5 main | git log main |
Bash(* --version) | node --version | node -v |
Bash(ls *) | ls -la、ls | lsof |
Bash(ls*) | ls -la、lsof |
三条匹配规则:* 代表它所在位置的任何文本;结尾的 *(前面有空格)也匹配裸命令(Bash(ls *) 匹配 ls),但仅当结尾的 * 是规则里唯一的通配符时;结尾 * 之前的空格是规则的一部分(Bash(ls *) 要求 ls 后有空格,所以 lsof 不匹配,而 Bash(ls*) 匹配 lsof)。:* 后缀是书写结尾通配符的等价方式(Bash(ls:*) 与 Bash(ls *) 匹配相同的命令)。
工具名通配符:deny 和 ask 规则也接受工具名位置的 glob 模式,模式必须匹配完整工具名:"*" 匹配每个工具,"mcp__*" 匹配所有服务器的每个 MCP 工具。allow 规则只在字面的 mcp__<server>__ 前缀之后接受工具名 glob。
工具特定的权限规则
Bash
Bash 规则匹配整条命令文本,* 代表任意文本。
复合命令:Claude Code 了解 shell 操作符,所以 Bash(safe-cmd *) 这样的规则不会授权运行命令 safe-cmd && other-cmd。识别的命令分隔符有 &&、||、;、|、|&、& 和换行;规则必须独立匹配每个子命令。deny 和 ask 规则在任何子命令匹配时都适用,包括嵌套在子 shell、命令替换或 for 循环体里的命令。
包装器:匹配 Bash 规则之前,Claude Code 会剥离一组固定的包装器(timeout、time、nice、nohup、stdbuf,以及 shell 内建 command 和 builtin),所以 Bash(npm test *) 也匹配 timeout 30 npm test;它还会剥离某些已知安全的环境变量赋值前缀(如 NODE_ENV=test npm test)。这个包装器列表是内置的、不可配置,direnv exec、devbox run、npx、docker exec 这类开发环境运行器不在其中。
Bash 规则不匹配什么:它匹配 Claude 写下的命令文本,不匹配以不同形式调用的同一程序,所以 deny 或 ask 规则只覆盖 Claude 通常使用的调用方式:
| 规则 | 阻止 | 不阻止 |
|---|---|---|
Bash(curl *) | curl https://example.com | /usr/bin/curl https://example.com、sh -c 'curl https://example.com' |
Bash(rm *) | rm -rf build/ | /bin/rm -rf build/、bash -c 'rm -rf build/' |
Bash(git push *) | git push origin main | git -C . push origin main、git 'push' origin main |
想要不依赖命令文本的文件系统和网络强制,用沙箱;想在命令运行前用你自己的逻辑检查完整命令文本,用 PreToolUse Hook。
只读命令:Claude Code 把一组内置的 Bash 命令认作只读,在每个模式下都不经权限提示运行。像 ls > out.txt 这样的重定向会对目标增加检查。
Read 和 Edit
想阻止 Claude 的文件工具读取某个文件或目录,为其路径添加 Read 的 deny 规则,如 Read(./.env) 或 Read(./secrets/**)。Edit 规则适用于所有编辑文件的内置工具;Claude 会尽力把 Read 规则应用到所有读取文件的内置工具(如 Grep 和 Glob)、提示里的 @file 提及,以及连接的 IDE 的选区和打开文件上下文。Read 和 Edit 的 deny 规则也适用于 Claude Code 在 Bash 里识别的文件命令(如 cat、head、tail、sed、tee)以及 > file 和 < file 这类重定向的目标。
Read 和 Edit 规则都使用 gitignore 模式语法,有四种不同的模式类型:
| 模式 | 含义 | 示例 | 匹配 |
|---|---|---|---|
//path | 从文件系统根开始的绝对路径 | Read(//Users/alice/secrets/**) | /Users/alice/secrets/** |
~/path | 从家目录开始的路径 | Read(~/Documents/*.pdf) | /Users/alice/Documents/*.pdf |
/path | 相对于设置来源的路径 | Edit(/src/**/*.ts) | 项目设置里是 <主要工作目录>/src/**/*.ts |
path 或 ./path | 相对于当前目录的路径 | Read(*.env) | <cwd>/*.env |
像
/Users/alice/file这样的模式不是绝对路径。单个前导斜杠锚定在设置来源,而不是文件系统根;绝对路径要用//Users/alice/file。
WebFetch
WebFetch 规则使用 domain: 前缀,与请求 URL 的主机名匹配(不区分大小写,支持 * 通配符):WebFetch(domain:example.com) 匹配对 example.com 的请求;WebFetch(domain:*.example.com) 匹配任意深度的子域名(如 api.example.com、a.b.example.com),但不匹配 example.com 本身;WebFetch(domain:*) 匹配每个域名。
MCP
MCP 规则使用在 Claude Code 里配置的服务器名,后面可选地跟该服务器的工具名:mcp__puppeteer 匹配 puppeteer 服务器提供的任何工具;mcp__puppeteer__* 用通配符语法同样匹配该服务器的所有工具;mcp__puppeteer__puppeteer_navigate 匹配 puppeteer 服务器提供的 puppeteer_navigate 工具。
Agent(子智能体)
用 Agent(AgentName) 规则控制 Claude 能使用哪些子智能体:Agent(Explore) 匹配 Explore 子智能体,Agent(Plan) 匹配 Plan,Agent(my-custom-agent) 匹配名为 my-custom-agent 的自定义子智能体。把这些规则加到设置里的 deny 数组,或使用 --disallowedTools CLI 标志,可以禁用特定智能体。要禁用 Explore:
{
"permissions": {
"deny": ["Agent(Explore)"]
}
}用 Hook 扩展权限
Claude Code Hook 让你注册自定义 shell 命令,在运行时评估权限。PreToolUse Hook 在权限提示之前运行。Hook 的决定不会绕过权限规则:不管 PreToolUse Hook 返回什么,Claude Code 都会评估 deny 和 ask 规则——匹配的 deny 规则阻止调用,匹配的 ask 规则即使 Hook 返回了 "allow" 或 "ask" 仍会提示。阻止型 Hook 也优先于 allow 规则:以退出码 2 退出的 Hook 在权限规则被评估之前就停止工具调用。
工作目录
默认 Claude 能访问你启动它所在目录里的文件,该目录是会话的主要工作目录(直到你用 /cd 移动会话)。你可以扩展访问:启动时用 --add-dir <path> 参数;会话中用 /add-dir 命令;持久配置则加到设置文件的 additionalDirectories。额外目录里的文件遵循与原工作目录相同的权限规则:无需提示即可读取,文件编辑权限遵循当前权限模式。
权限与沙箱的关系
权限和沙箱是互补的安全层:权限控制 Claude Code 能使用哪些工具、能访问哪些文件或域名,适用于 Bash、Read、Edit、WebFetch、MCP 和其他所有工具;沙箱提供 OS 级强制,限制 shell 命令的文件系统和网络访问,只适用于 Bash、PowerShell 和 Monitor 命令及其子进程。两者一起用提供纵深防御,因为即使提示注入绕过了 Claude 的决策,沙箱限制依然有效。
当你启用沙箱并把 autoAllowBashIfSandboxed 保持在默认值 true 时,沙箱内的 Bash 命令即使在你的权限里有裸的 Bash ask 规则时也不经提示就运行:沙箱边界替代了每命令提示。以下检查仍然适用:内容限定的 ask 规则(如 Bash(git push *))仍会强制提示;显式 deny 规则仍然适用;针对关键路径的 rm 或 rmdir 命令仍然走常规权限流程。
受保护路径
对一小组路径的写入永远不会被自动批准(bypassPermissions 模式除外),以防止意外破坏仓库状态和 Claude 自己的配置。各模式下的处理:default 和 acceptEdits 提示;auto 交给分类器;dontAsk 拒绝;bypassPermissions 允许。注意:设置文件里的 permissions.allow 规则不会预批准受保护路径的写入(比如 ~/.claude/settings.json 里的 Edit(.claude/**)),因为安全检查在 Claude Code 评估设置里的 allow 规则之前运行。
托管设置与优先级
组织可以通过托管设置部署不可被个人覆盖的权限策略,权限设置遵循设置优先级。
项目 allow 规则与工作区信任
提交进仓库的 .claude/settings.json 里的 allow 规则要等你信任该文件夹后才生效,因为恶意仓库不应通过自己的设置文件预批准命令。你自己的 .claude/settings.local.json(未被 git 跟踪时)里的 allow 规则无需这个信任步骤就生效,因为那个文件是你的,而不是仓库的。