Appearance
使用Claude Code的人,几乎都在吐槽同一个问题:每次想让它编辑文件或跑测试,都要点一下"允许"。一个小功能搞下来鼠标要连点几十次,整个思路都断了。一个settings.json文件,几条规则,就能让Claude不再为日常操作反复请求许可,同时又牢牢锁住那些真正可能搞出大问题的命令。
文件存放位置
和CLAUDE.md一样,分三个层级:
| 层级 | 路径 | 生效范围 |
|---|---|---|
| 全局 | ~/.claude/settings.json | 对所有项目生效 |
| 项目级 | .claude/settings.json | 团队共享,提交到git |
| 本地 | .claude/settings.local.json | 个人独有,应加入gitignore |
各层级的规则会自动合并。 比如全局设置允许Bash(npm *),而项目设置里禁止了Bash(npm publish),两条规则会同时生效。禁止规则的优先级永远高于允许规则。
权限系统速览
三个数组控制一切:
json
{
"permissions": {
"allow": [], // 直接使用,不弹确认框
"deny": [], // 完全不能碰
"ask": [] // 每次都询问
}
}判断顺序:先查deny → 再查ask → 最后allow。 对于同一个工具,deny规则始终会覆盖allow规则。
规则的写法: 工具名称 或 工具名称(模式)
json
"Bash" // 所有bash命令(风险极高)
"Bash(npm install)" // 只匹配npm install
"Bash(npm run *)" // 匹配任何npm run脚本
"Write(src/**)" // 只允许在src/目录下写文件⚠️ 注意:
Bash(ls *)能匹配ls -la,但匹配不到lsof。这里用的是glob模式,不是正则。
五种权限模式
除了逐条写规则,也可以直接设定一个默认模式:
json
{
"permissions": {
"defaultMode": "default"
}
}| 模式 | 说明 |
|---|---|
default | 危险操作一律询问 |
acceptEdits | 自动批准文件编辑,bash仍需询问 |
plan | 只读模式,不允许任何修改 |
dontAsk | 所有未显式允许的操作全部拒绝 |
bypassPermissions | 批准一切(仅限容器或CI环境) |
会话过程中可以随时切换: 按Shift+Tab就能在default、acceptEdits和plan三种模式之间循环切换。
哪些该放行(安全清单)
以下命令每天要反复执行几十次,让Claude直接运行能省下大量时间:
json
{
"permissions": {
"allow": [
"Read",
"Glob",
"Grep",
"LS",
"Bash(npm run *)",
"Bash(npm install *)",
"Bash(npm test *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git checkout *)",
"Write(src/**)",
"Edit",
"MultiEdit"
]
}
}规律: 读操作全放开,Bash命令只针对特定工具放行,写文件只限定在src/目录内。
哪些该禁止(安全防线)
以下命令可能造成严重损失,要一视同仁地封堵:
json
{
"permissions": {
"deny": [
"Read(.env*)",
"Read(**/secrets/**)",
"Write(.env*)",
"Write(production.*)",
"Write(.github/workflows/*)",
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(git push *)",
"Bash(git merge *)",
"Bash(npm publish *)",
"Bash(docker *)",
"Bash(curl * | sh)",
"Bash(wget *)"
]
}
}核心原则: Claude可以读代码、写代码、跑测试、提交变更。但它永远不能读取密钥,不能push到远端仓库,不能递归删除文件,也不能运行任何带sudo的命令。
给settings.json加上钩子
设置和钩子可以放在同一个文件里。比如每次编辑完自动格式化代码:
json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write(*.py)",
"hooks": [
{
"type": "command",
"command": "python -m black $file"
}
]
},
{
"matcher": "Write(*.ts)",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $file"
}
]
}
]
}
}每个.py文件保存后自动用Black格式化,每个.ts文件保存后自动用Prettier格式化。不弹窗,不用手动操作。
团队共享配置
把项目级配置放在.claude/settings.json里提交到git,整个团队就能共用同一套权限:
json
{
"permissions": {
"allow": [
"Read",
"Glob",
"Grep",
"Bash(npm run *)",
"Bash(npm test *)"
],
"deny": [
"Read(.env*)",
"Bash(npm publish *)",
"Bash(rm -rf *)",
"Write(production.*)"
],
"defaultMode": "acceptEdits"
}
}新同事拉下仓库,打开Claude Code,一切都已配置妥当。 不用折腾初始设置,不用纠结哪些命令该放行,也不用担心有人不小心放行了Bash(rm -rf *)。
完整配置示例
这是一套针对Node.js/TypeScript项目可以直接使用的完整settings.json:
json
{
"permissions": {
"allow": [
"Read", "Glob", "Grep", "LS",
"Edit", "MultiEdit",
"Write(src/**)", "Write(tests/**)", "Write(docs/**)",
"Bash(npm run *)", "Bash(npm install *)", "Bash(npm test *)",
"Bash(npx tsc *)", "Bash(npx vitest *)", "Bash(npx prettier *)",
"Bash(git status)", "Bash(git diff *)", "Bash(git log *)",
"Bash(git add *)", "Bash(git commit *)", "Bash(git checkout *)",
"Bash(git branch *)", "Bash(cat *)", "Bash(head *)",
"Bash(tail *)", "Bash(wc *)", "Bash(find *)", "Bash(echo *)"
],
"deny": [
"Read(.env*)", "Read(**/secrets/**)",
"Write(.env*)", "Write(production.*)",
"Write(.github/workflows/*)", "Write(package-lock.json)",
"Bash(rm -rf *)", "Bash(sudo *)", "Bash(git push *)",
"Bash(git merge *)", "Bash(git rebase *)",
"Bash(npm publish *)", "Bash(docker *)",
"Bash(curl * | sh)", "Bash(wget *)",
"Bash(chmod *)", "Bash(chown *)"
],
"defaultMode": "acceptEdits"
},
"hooks": {
"PostToolUse": [
{
"matcher": "Write(*.ts)",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $file"
}
]
}
]
}
}配置前后对比
| 配置前 | 配置后 |
|---|---|
| 每次会话弹出30- |
