📌 标签 :
#权限系统#安全#模式切换#配置管理

Claude Code 拥有强大的自主能力,但这种能力必须被关进"安全的笼子"。权限系统就是那个笼子------它决定了 AI 什么时候可以放手去做,什么时候必须停下来问你。
1. 为什么需要权限系统?
Agent 模式的本质是"AI 替你执行操作"。但如果 AI 可以随意修改文件、删除目录、运行危险的 shell 命令,后果不堪设想。
想象一下这些场景:
- 你在生产服务器上运行
claude,AI 误以为需要删除node_modules并重新安装,执行了rm -rf node_modules(虽然不会直接删库,但也很麻烦) - AI 在重构代码时,错误地覆盖了重要的配置文件
- 你在 CI 环境中让 AI 自动修复代码,但它陷入了无限循环,不断提交修改
权限系统的目标:
- 让 AI 能够完成工作,但默认不信任任何写操作或危险命令
- 提供灵活的模式,让用户根据场景平衡"便利性"与"安全性"
- 记录所有操作,便于审计和回滚
Claude Code 提供了四种权限模式,从最安全到最自动,依次为:Plan → Default → Bypass → Auto。
2. 四种模式速览
| 模式 | 读操作 | 写操作(Edit/Write) | Shell 命令 | 典型场景 |
|---|---|---|---|---|
| Plan | 允许(自动) | 禁止(只输出计划,不执行) | 禁止(除非只读命令如 ls) |
高风险任务前的审核 |
| Default | 允许(自动) | 请求确认(显示 diff) | 请求确认(显示完整命令) | 日常开发(推荐) |
| Bypass | 允许 | 自动允许(需用户预先批准) | 自动允许(需预先配置白名单) | 信任的本地项目 |
| Auto | 允许 | 自动允许(无确认) | 自动允许(无确认) | CI/CD、自动化脚本 |
注意:即使是 Auto 模式,Claude Code 也不会执行某些极度危险的命令(如
rm -rf /),内置了硬编码黑名单。
3. 模式详解
3.1 Plan 模式------先看方案,再动手
适用场景:你不确定 AI 的计划是否合理,或者任务涉及修改重要配置、生产环境相关代码。
行为:
- AI 会完整分析任务,输出详细的执行计划(包括要修改哪些文件、执行哪些命令)
- AI 不会调用任何修改性工具(Write、Edit、Bash 执行非只读命令)
- 你可以审核计划,然后手动切换到其他模式让 AI 执行,或修改指令后重新生成计划
如何进入:
bash
/mode plan
对话示例:
Claude Code > /mode plan
Switched to Plan mode. I will only propose plans, not execute changes.
Claude Code > 帮我将项目中的 axios 替换为 fetch
AI 输出:
[Plan] 将 axios 替换为 fetch
我将执行以下步骤:
1. 搜索所有 import axios from 'axios' 或 require('axios') 的文件(预计约 8 个文件)
2. 读取这些文件,分析 axios 的使用方式(主要是 .get/.post 和拦截器)
3. 对于每个文件:
a. 移除 axios 导入
b. 添加 fetch 包装函数(复用已有的 fetch 配置,或创建新的)
c. 将 axios 调用改为 fetch 调用,处理响应和错误
4. 移除 package.json 中的 axios 依赖
5. 运行 npm test 确保功能正常
是否继续?输入 "execute" 让我切换到 Default 模式并执行,或 "modify" 修改计划。
你审阅后可以输入 execute,AI 会提示你先手动切换到 Default 或 Auto 模式,然后重新触发任务。
Plan 模式的技巧:
- 可以用
/mode default后再执行,或者直接说"按照上面的计划执行,但每次修改前让我确认" - Plan 模式也能帮助你自己理清思路------让 AI 输出计划后再决定是否真的需要改动
3.2 Default 模式------日常开发的安全平衡点
适用场景:绝大多数开发任务,你想要效率,但又希望控制风险。
行为:
- 读操作(Read、LS、Grep):自动执行,无需确认
- 写操作(Write、Edit):弹出确认提示,显示将要修改的文件和 diff 内容
- Shell 命令 :弹出确认提示,显示完整命令,并标注是否危险(如
rm,sudo,chmod等) - 你可以在确认时选择:
y- 执行本次操作n- 拒绝本次操作,AI 会尝试其他方案a- 本次会话中对此类操作全部允许(类似于临时 Bypass)N- 拒绝并禁止 AI 再次尝试相同操作
如何进入:
bash
/mode default
确认提示示例:
Claude Code wants to edit src/utils.js
Diff:
@@ -12,6 +12,7 @@
function formatPrice(price) {
+ if (price < 0) return 'Invalid price';
return `$${price.toFixed(2)}`;
}
Allow this edit? (y/n/a/N)
Default 模式的最佳实践:
- 保持默认模式,不要轻易切换,除非你完全信任当前项目
- 对于频繁确认的操作(比如一次重构需要修改 20 个文件),可以临时使用
a允许本次会话的所有同类操作,但不要全局 Bypass - 定期检查
/cost和操作历史,了解 AI 做了哪些事
3.3 Bypass 模式------信任项目的半自动模式
适用场景:你完全信任当前项目(如个人 side project、完全受控的开发容器),不想每次操作都点确认,但仍希望对某些危险命令保持警惕。
行为:
- 读操作:自动
- 写操作:自动允许,但会记录日志
- Shell 命令:根据白名单 判断。默认白名单包含
npm,yarn,pip,git等常见安全命令;危险命令(如rm,mv覆盖重要文件,sudo)仍需确认 - 你可以自定义白名单(见下文配置)
如何进入:
bash
/mode bypass
配置白名单 (在 ~/.config/claude-code/config.toml 或项目 .claude/config.toml):
toml
[permissions.bypass]
# 自动允许的命令前缀
allowed_commands = [
"npm run",
"npm test",
"git status",
"git diff",
"ls",
"cat",
"echo",
"python",
"node"
]
# 仍然需要确认的命令(可覆盖默认危险模式)
dangerous_commands = [
"rm -rf",
"sudo",
"chmod",
"kill"
]
注意 :Bypass 模式不是"无限制"。内置的安全黑名单(如 rm -rf /, :(){ :|:& };: 等 fork bomb)在任何模式下都不会执行。
3.4 Auto 模式------无人值守的完全自动化
适用场景:CI/CD 流水线、自动化脚本、预提交钩子等非交互环境。
行为:
- 所有操作(读、写、Shell)自动允许,无任何确认提示
- 但仍然遵循内置安全黑名单
- 适合与
--print非交互参数结合使用
如何进入:
bash
/mode auto
或在启动时指定:
bash
claude --mode auto
CI 示例(GitHub Actions):
yaml
- name: Run Claude Code to fix lint issues
run: |
echo "修复 ESLint 错误" | claude --mode auto --print
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
⚠️ 警告:
- Auto 模式会自主修改文件、提交代码。务必在 CI 中限制权限(如只允许在 PR 分支上运行,且不自动 push)
- 建议结合
--allowed-tools进一步限制(如只允许Read,Grep,禁止Write,Bash) - 始终在 Auto 模式前运行
claude --dry-run或 Plan 模式预演
4. 模式切换实战
4.1 典型工作流
-
新任务/高风险任务:
bash/mode plan让 AI 输出计划 → 审阅 → 满意后,输入
/mode default或手动执行。 -
日常开发:
bash/mode default边确认边执行,既安全又不烦人(批量操作时用
a暂时允许)。 -
重构已熟悉的模块:
bash/mode bypass信任项目,但危险命令仍需确认。
-
CI 自动修复:
bashclaude --mode auto --print "自动修复 lint 错误"
4.2 单次命令临时提升权限
你不需要全局切换模式。在 Default 模式下,如果 AI 请求执行一个操作,你可以直接回复"允许本次操作"或"允许所有类似的编辑操作(本次会话)"。
例如:
Claude Code > 修改 src/theme.js 中的颜色变量
[AI 显示 diff,请求确认]
你输入:a # 表示本次会话中所有编辑操作都自动允许
这相当于临时进入 Bypass 模式,但仅对写操作有效,且仅限当前会话。
5. 安全边界与黑名单
无论哪种模式,Claude Code 都不会执行以下操作(硬编码保护):
| 类别 | 禁止的命令/模式 |
|---|---|
| 文件系统破坏 | rm -rf /, rm -rf /*, dd if=/dev/zero of=/dev/sda |
| 权限提升 | sudo 后跟危险命令(某些白名单内的 sudo 允许,如 sudo apt update 会请求确认) |
| 系统配置 | 修改 /etc/passwd, /etc/shadow, /etc/sudoers |
| 远程破坏 | `curl ... |
| Fork bomb | `:(){ : |
| 加密勒索类 | 不会执行加密或删除用户数据的命令 |
同时,Claude Code 在尝试读取 .env, *.pem, id_rsa 等敏感文件时会发出警告,并建议你不要将其包含在上下文中。
6. 常见问题与解决方案
Q1: 我在 Default 模式下,AI 要修改 30 个文件,每个都要按 y,太累了。怎么办?
A : 在第一个确认提示时输入 a(Allow all for this session),后续所有编辑操作会自动允许(但 shell 命令仍需确认)。或者临时切换到 Bypass 模式:/mode bypass。
Q2: AI 在 Auto 模式下跑飞了,执行了危险的 rm 命令怎么办?
A : 首先,内置黑名单会阻止最危险的命令。但如果 AI 执行了 rm ./important.log(非全局删除),系统会允许。建议:不要在 Auto 模式下运行未经充分测试的任务。先 Plan 模式审核,或用 --allowed-tools 限制工具集。
Q3: 我想让 AI 永远不需要确认编辑操作,但仍需要确认 shell 命令。
A: 使用 Bypass 模式,并在配置中设置:
toml
[permissions.bypass]
allowed_commands = [] # 空列表意味着所有 shell 命令都需要确认
然后手动确认每个命令。或者保持 Default 模式,但回答 a 来允许所有编辑。
Q4: 如何查看当前模式?
A : 输入 /mode 不带参数,会显示当前模式及可用的模式列表。
Q5: 能否为不同项目设置不同的默认模式?
A : 可以。在项目根目录的 .claude/config.toml 中设置:
toml
[mode]
default = "bypass" # 该项目默认使用 bypass 模式
7. 与其他工具的权限对比
| 工具 | 权限模型 | 是否支持计划先行 | 危险命令黑名单 |
|---|---|---|---|
| Claude Code | 四级模式 + 用户确认 + 黑名单 | ✅ (Plan) | ✅ |
| GitHub Copilot | 无(只建议,不执行) | ❌ | 不适用 |
| Cursor | 需手动点"Apply"或"Run" | ❌ | 有限(需插件) |
| Aider | 自动提交但需确认 | ❌ | 无 |
| AutoGPT | 无,用户需时刻监控 | ❌ | 无 |
Claude Code 的权限系统是目前终端 AI 工具中最完善的,兼顾了安全、灵活性和自动化需求。
8. 下篇预告
权限系统管住了 AI 的"手脚",但要让 AI 发挥最大效用,你需要学会如何"说话"------提示词(Prompt)的核心技巧。下一篇将深入讲解如何编写高效的提示词,让 Claude Code 准确理解你的意图。
👉 下一篇: 提示词(Prompt)核心技巧:上下文、预期行动、成功标准,缺一不可
思考题(自测理解)
- 你在 CI 流水线中想要 Claude Code 自动修复常见的 lint 问题并提交 PR。应该使用哪种模式?需要注意哪些安全问题?
- 为什么 Plan 模式下仍然允许读操作?如果禁止读操作,Plan 模式还能工作吗?
- 假设你想让 AI 在 Default 模式下自动允许
npm test命令(因为它只是运行测试,不修改代码),但保留对其他命令的确认。能否通过配置实现?如何做?
安全是自由的边界。掌握权限模式,你就能放心地把更多工作交给 AI。下一章,我们将把 AI 的能力发挥到极致------从"会说"到"会做"。