Claude Code settings.json 详解(二):permissions 权限系统全解析
为什么 permissions 很重要
在上一篇里,我们介绍了 Claude Code 的五层配置体系,知道了配置文件在哪里、谁说了算。这一篇聚焦 permissions 字段——它决定了 Claude 能做什么、不能做什么、以及哪些操作需要你点头。
配置对了,Claude 可以在你圈定的范围里自由发挥;配置错了,要么频繁打扰你确认,要么给了 Claude 不该有的权限。
permissions 对象的完整结构
{
"permissions": {
"allow": [],
"deny": [],
"ask": [],
"defaultMode": "default",
"additionalDirectories": []
}
}
五个字段,分两类:
- 规则数组:
allow/deny/ask,每个元素是一条权限规则 - 全局设置:
defaultMode(默认模式)、additionalDirectories(额外目录)
规则格式:两种写法
每条权限规则都是一个字符串,格式如下:
ToolName
ToolName(content)
ToolName:工具名称,大写开头,如Bash、Write、Read(content):可选的内容匹配部分,括号内填命令或路径模式
示例:
"allow": [
"Bash",
"Bash(npm install)",
"Bash(npm run:*)",
"Write(src/**)",
"mcp__github__create-pull-request"
]
第一条 "Bash" 允许所有 Bash 命令,不加任何限制。第二条只允许完整匹配 npm install 这一条命令。第三条用通配符匹配所有 npm run 开头的命令。
三种规则行为
| 数组 | 效果 |
|---|---|
allow | 始终允许,不弹确认框 |
deny | 始终拒绝,Claude 直接收到拒绝响应 |
ask | 每次执行前弹出确认框,无论 defaultMode |
优先级:deny > allow > ask > defaultMode 默认行为。
常见用法——精确放行某类命令,其余均拒绝:
{
"permissions": {
"allow": ["Bash(npm:*)", "Bash(git:*)"],
"deny": ["Bash"]
}
}
先写 allow 放行 npm 和 git 相关命令,再写 deny 兜底拒绝所有其他 Bash 命令。注意顺序在逻辑上是”先匹配具体规则,再匹配宽泛规则”,而不是数组的物理顺序。
通配符语法详解
旧式:前缀匹配 prefix:*
Bash(npm:*)
Bash(git:*)
Bash(docker:*)
格式为 ToolName(prefix:*),匹配 prefix 或 prefix <任意内容>,并且强制词边界——不会匹配 npmx 这种情况。
这是最早的通配符语法,目前仍然有效,主要用于命令行工具的主命令前缀匹配。
新式:通配符模式 *
Bash(npm * --save)
Bash(git * main)
Bash(* install)
Write(src/**/*.ts)
* 匹配任意字符序列(包括空格)。这种写法更灵活,可以匹配中间某段、结尾某段、或路径中的多级目录。
特殊行为:如果规则以 * 结尾且只有一个通配符,则这个尾部通配符是可选的。也就是说 Bash(git *) 同时匹配 git add、git checkout 和裸命令 git。
转义字符
如果命令或路径里本身包含括号或星号,需要转义:
| 字符 | 转义写法 | 说明 |
|---|---|---|
( | \( | 字面左括号 |
) | \) | 字面右括号 |
\ | \\ | 字面反斜杠 |
* | \* | 字面星号 |
示例:
"allow": ["Bash(python -c \"print\\(1\\)\")"]
这条规则匹配字面命令 python -c "print(1)"。
MCP 工具权限规则
MCP 工具用双下划线分隔,格式如下:
mcp__serverName
mcp__serverName__toolName
mcp__github:允许 GitHub MCP 服务器的所有工具mcp__github__create-pull-request:只允许该服务器的某个具体工具mcp__github__*:等同于mcp__github,明确用通配符表示”全部工具”
注意:MCP 规则不支持括号内容,写法 mcp__server(pattern) 是无效的。
defaultMode:全局默认模式
当一个操作没有命中任何 allow / deny / ask 规则时,由 defaultMode 决定默认行为:
| 值 | 行为 |
|---|---|
default | 弹确认框(默认值) |
acceptEdits | 文件编辑类操作自动批准,命令执行仍弹框 |
bypassPermissions | 跳过所有权限检查,完全自动化(需要满足特定条件才能开启) |
dontAsk | 自动批准所有操作,不弹任何确认框 |
plan | 仅规划模式,不执行任何写操作 |
推荐搭配:
开发阶段可以用 acceptEdits,让 Claude 自由读写文件,但执行 shell 命令前还是要确认;如果是在 CI/自动化环境中运行,可以搭配精细的 allow 规则 + dontAsk,实现全自动。
additionalDirectories:扩展可访问目录
默认情况下,Claude Code 只能访问当前工作目录及其子目录。additionalDirectories 可以额外授权其他路径:
{
"permissions": {
"additionalDirectories": ["/Users/yourname/shared-libs", "/var/log/myapp"]
}
}
常见用途:monorepo 中跨子包访问、读取项目外的共享配置文件、查看系统日志等。
路径数组遵循上一篇介绍的合并规则:多层配置的 additionalDirectories 会拼接在一起,而不是互相覆盖。
规则来源与可编辑性
权限规则可以来自不同的配置来源(见第一篇),但并非所有来源都允许修改:
| 来源 | 是否可编辑 | 说明 |
|---|---|---|
userSettings | 是 | ~/.claude/settings.json |
projectSettings | 是 | .claude/settings.json |
localSettings | 是 | .claude/settings.local.json |
policySettings | 否(只读) | 企业管理员下发的策略,不可覆盖 |
flagSettings | 否(只读) | CLI 启动参数或环境变量,只读 |
企业场景下,管理员可以通过 policySettings 强制锁定某些权限规则,员工的个人配置无法绕过。
几个实用配置示例
只允许 npm 和 git,拒绝其他 Bash:
{
"permissions": {
"allow": ["Bash(npm:*)", "Bash(git:*)"],
"deny": ["Bash"],
"defaultMode": "default"
}
}
允许在 src 目录内自由写文件,但写 src 之外需确认:
{
"permissions": {
"allow": ["Write(src/**)"],
"defaultMode": "default"
}
}
CI 环境全自动运行:
{
"permissions": {
"allow": ["Bash", "Write", "Read"],
"defaultMode": "dontAsk"
}
}
保护特定命令,强制每次确认:
{
"permissions": {
"ask": ["Bash(sudo *)"],
"allow": ["Bash(npm:*)", "Bash(git:*)"]
}
}
小结
permissions 是 Claude Code 配置里最值得花时间搞清楚的字段。核心逻辑很简单:
- 用
allow/deny/ask三个数组圈定规则 - 规则支持精确匹配、前缀通配(
prefix:*)、模式通配(*) - MCP 工具用双下划线格式,不支持括号内容
defaultMode处理没有命中规则的情况additionalDirectories扩展可访问目录
下一篇会介绍 hooks——如何在 Claude 执行工具前后自动触发你的 shell 脚本,实现更深层的自动化控制。
更多同类文章
- AI-first 创业公司,为什么只需要一种编程语言?
- cc-ping:一行命令 Ping 所有 Claude Code 配置
- 震惊!程序员用这个工具,4分钟干完95分钟的活!效率暴涨24倍
- CCBot - 研发提效 24 倍
- Claude Code /add-dir:被低估的 Monorepo 神器
- Claude Code 省 Token 小技巧:感叹号的妙用
- 我做了个机器人,让团队在飞书里用 Claude Code
- Claude Code /btw 命令详解:不打扰主线的快问快答
- Claude Code /compact:释放上下文,不丢进度
- Claude Code /config:一文搞懂所有可调设置
- Claude Code /context:你的上下文都被什么吃了?
- Claude Code /diff:这次对话改了什么,一目了然
- Claude Code /fast:同样的 Opus,两倍速——值不值?
- Claude Code 引用外部知识的最佳实践:GitHub MCP + Context7
- Claude Code /hooks:让 AI 按你的规矩办事
- Claude Code /init:10 秒自动生成 CLAUDE.md
- Claude Code MCP:让 AI 连接 GitHub、数据库等一切工具
- Claude Code /memory 详解:让 AI 真正记住你的项目
- Claude Code /model:Opus、Sonnet、Haiku 怎么选?
- Claude Code /permissions:谁能干什么,你说了算
- Claude Code /plan 详解:先想清楚再动手
- Claude Code + Playwright MCP:AI 终于能"看见"页面了
- Claude Code /resume 命令详解:别让对话白聊
- Claude Code /review:让 AI 帮你做 Code Review
- Claude Code Skills 详解:打造你的专属命令库
- Claude Code /stats:看看 AI 到底帮你写了多少代码
- Claude Code /status 命令详解:一眼看清会话全貌
- Claude Code /tasks 命令详解:后台任务尽在掌控
- Claude Code /usage 命令详解:你的额度还剩多少
- Claude Code /vim:在 AI 编程助手里用 Vim 键位
- Claude Code 使用指南:从安装到实战,一篇就够(2026)
- Claude 全家桶:从聊天到写代码到自动办公,一文讲清楚
- Claude Code /agents 详解:自定义 AI 子代理,各司其职
- Claude Code /doctor 详解:一键诊断你的开发环境
- Claude Code /effort 详解:控制 AI 思考的深度
- Claude Code /cost 详解:你的 AI 编程到底花了多少钱
- Claude Code /export 详解:把 AI 对话带走
- Claude Code /rewind 详解:AI 改错了?一键回退
- Claude Code /plugin 详解:给你的 AI 编程助手装插件
- Claude Code /theme 详解:给你的终端换个好看的皮肤
- Claude Code /insights 详解:用 AI 分析你自己用 AI 的方式
- Claude Code /rename 详解:给你的会话取个有意义的名字
- Claude Code settings.json 详解(一):配置文件在哪里、谁说了算
- Claude Code settings.json 详解(三):hooks 钩子全解析
- Claude Code settings.json 详解(四):env、模型、认证与其他实用字段