Claude Code 的权限系统提供精细的工具访问控制——从允许特定 git 命令到阻止所有网络请求,支持项目级、用户级和企业托管三层配置,可提交到版本控制共享给整个团队。
权限层级
| 工具类型 | 示例 | 首次使用是否需要审批 | "不再询问"行为 |
|---|---|---|---|
| 只读 | 文件读取、Grep | 否 | 不适用 |
| Bash 命令 | Shell 执行 | 是 | 按项目目录和命令永久记住 |
| 文件修改 | Edit/Write 文件 | 是 | 会话结束前有效 |
管理权限
/permissions
列出所有权限规则及其来源的 settings.json 文件。
- Allow 规则:免审批直接使用工具
- Ask 规则:使用工具时弹出确认对话框
- Deny 规则:阻止使用工具
规则评估顺序:deny → ask → allow,第一个匹配规则胜出(Deny 始终优先)。
5 种权限模式
| 模式 | defaultMode 值 | 说明 |
|---|---|---|
| Standard(默认) | default | 首次使用每个工具时提示 |
| Auto accept edits | acceptEdits | 自动接受文件编辑权限 |
| Plan Mode | plan | 只能分析,不能修改文件或执行命令 |
| Don't Ask | dontAsk | 自动拒绝工具(除非已预先批准) |
| Bypass | bypassPermissions | 跳过所有权限提示(仅限隔离环境) |
bypassPermissions会禁用所有权限检查,仅在容器/VM 等隔离环境中使用。管理员可通过disableBypassPermissionsMode: "disable"禁止此模式。
权限规则语法
格式:Tool 或 Tool(specifier)
匹配工具所有用法
Bash # 所有 Bash 命令
WebFetch # 所有网络请求
Read # 所有文件读取
Bash(*) 等同于 Bash。
精细控制(带 specifier)
Bash(npm run build) # 精确匹配命令
Read(./.env) # 匹配当前目录的 .env
WebFetch(domain:example.com) # 仅限 example.com
通配符模式(Bash)
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)",
"Bash(git * main)",
"Bash(* --version)",
"Bash(* --help *)"
],
"deny": [
"Bash(git push *)"
]
}
}空格边界规则(重要):Bash(ls *) 匹配 ls -la 但不匹配 lsof(空格前的 * 强制单词边界);Bash(ls*) 同时匹配两者。
Shell 操作符感知:Bash(safe-cmd *) 不会允许 safe-cmd && other-cmd,Claude Code 能识别 && 等操作符。
Read / Edit 规则的路径格式
| 前缀 | 含义 | 示例 |
|---|---|---|
//path | 从文件系统根的绝对路径 | Read(//Users/alice/secrets/**) |
~/path | 相对于 home 目录 | Read(~/Documents/*.pdf) |
/path | 相对于项目根目录 | Edit(/src/**/*.ts) |
path 或 ./path | 相对于当前目录 | Read(*.env) |
注意:
/Users/alice/file不是绝对路径,是相对项目根!使用//Users/alice/file才是绝对路径。
* 匹配单目录文件,** 跨目录递归匹配。
MCP 工具权限
mcp__puppeteer # puppeteer 服务器的所有工具
mcp__puppeteer__* # 同上(通配符写法)
mcp__puppeteer__puppeteer_navigate # 特定工具
Agent 权限
{
"permissions": {
"deny": ["Agent(Explore)"]
}
}禁用特定 Subagent(如 Explore、Plan 或自定义 Agent)。
WebFetch 的网络控制注意事项
WebFetch(domain:github.com) 限制 WebFetch 工具,但不防止 Bash 中的 curl/wget 访问网络。
更可靠的 URL 过滤方案:
- 用 deny 规则阻止
curl、wget等命令,配合WebFetch(domain:...)限制允许域名 - 使用
PreToolUseHooks 验证 Bash 命令中的 URL - 在 CLAUDE.md 中说明允许的 curl 模式
Bash 权限规则对命令参数的约束是脆弱的——Bash(curl http://github.com/ *) 无法防止 curl https://github.com/...(不同协议)或 URL=http://... && curl $URL(变量展开)。
用 Hooks 扩展权限
PreToolUse Hooks 在权限系统之前运行,输出可以决定是否批准或拒绝工具调用:
#!/bin/bash
# 阻止 rm -rf 命令
COMMAND=$(jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q 'rm -rf'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "危险命令已被 Hook 拦截"
}
}'
else
exit 0
fi工作目录访问控制
默认:Claude 有权访问启动目录下的文件。扩展访问方式:
# 启动时
claude --add-dir /path/to/other/dir
# 会话中
/add-dir /path/to/other/dir// settings.json 永久配置
{
"additionalDirectories": ["/path/to/shared/libs"]
}权限与沙箱的关系
| 机制 | 作用范围 | 实现方式 |
|---|---|---|
| 权限系统 | 所有工具(Bash/Read/Edit/WebFetch/MCP/Agent) | Claude Code 应用层控制 |
| 沙箱(Sandboxing) | 仅 Bash 工具及其子进程 | OS 级别强制(macOS Seatbelt / Linux bubblewrap) |
两者互补:权限系统决定「能不能用」,沙箱决定「能访问哪里」。
配置示例
开发环境(允许常用工具)
{
"permissions": {
"allow": [
"Bash(npm *)",
"Bash(git *)",
"Bash(python *)",
"WebFetch(domain:api.github.com)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(sudo *)"
]
}
}企业安全(最小权限)
// managed-settings.json
{
"disableBypassPermissionsMode": "disable",
"allowManagedPermissionRulesOnly": true,
"permissions": {
"allow": ["Bash(npm run test)", "Bash(npm run lint)"],
"deny": ["WebFetch", "Bash(curl *)", "Bash(wget *)"]
}
}原文:Configure permissions - Claude Code Docs | 来源:Anthropic 官方文档