本教程面向第一次安装 Claude Code 的零基础学习者。学习目标是:理解 AI 编程助手为什么会反复弹窗询问"我可以这样做吗",掌握 Claude Code 的权限系统(六种模式 + allow/deny/ask 规则),并亲手造出一个可运行的番茄钟命令行小工具,在造工具的过程中把权限调到"既不烦人、又不危险"的舒适状态。完成本教程,你将不再被弹窗打断思路,也清楚什么时候绝不该点 Allow。
node -v 能输出版本号即可)cd 切换目录、能看懂命令输出很多新手第一次用 Claude Code 时都会被同一个问题困扰:它为什么不停问我"我可以创建这个文件吗?""我可以运行这条命令吗?",弹窗多到把思路打断。要理解这件事,必须先搞懂 Claude Code 的核心运行机制——回合制 Agent 循环(Agentic Loop)。
Claude Code 不是聊天机器人,而是一个会动手的智能体。它的每一次"思考"之后,几乎都会调用一个工具(Tool)去真正改变你的电脑状态:读文件(Read)、写文件(Write)、改文件(Edit)、跑命令(Bash)、抓网页(WebFetch)等等。一个完整循环是:
关键在第 3 步。因为工具调用会真实改变系统状态,Claude Code 默认采用"人在回路(human-in-the-loop)"策略:凡是可能造成副作用的高风险操作(写文件、删文件、跑命令、发网络请求),执行前都要先问人。
理解了这一点,你就明白了权限系统的本质——它不是在给你添堵,而是在替你兜底。一个能随意删文件、随意执行命令的 AI,没有这道闸门是极其危险的。权限系统就是你和这个强大智能体之间的契约:哪些事它可以直接做,哪些必须先请示,哪些永远不许做。
新手的第一课,不是学怎么让它干活,而是学会和这道闸门相处——把它调到你信任的程度。
打开终端,执行官方安装命令(以 npm 方式为例):
npm install -g @anthropic-ai/claude-code
安装完成后,验证版本:
claude --version
能看到版本号即安装成功。接着在任意目录启动:
mkdir ~/pomo && cd ~/pomo
claude
首次启动会引导你完成登录认证(浏览器跳转授权)。登录成功后,你会进入一个交互式界面,光标前通常是 > 提示符,下方有一行模式提示,类似:
>
(default) cwd: ~/pomo
这里的 (default) 就是当前所处的权限模式。下面我们来逐一拆解它。
权限模式(permission mode)决定了 Claude Code 在"没命中任何预定义规则"时,默认该问还是该做。截至 2026 年,Claude Code 提供 6 种模式,可在交互界面用 Shift + Tab 循环切换:
| 模式 | 中文名 | 行为 | 适用场景 |
|---|---|---|---|
default |
默认模式 | 高风险操作逐个询问 | 新手、重要项目、首次操作 |
acceptEdits |
自动接受编辑 | 文件编辑直接做,命令仍询问 | 重构、批量改代码 |
plan |
计划模式 | 只读探索,只出方案不执行 | 复杂任务先调研、看大纲 |
auto |
智能模式 | 安全操作自动放行,危险仍问 | 日常开发(新版本默认) |
dontAsk |
不询问 | 几乎不问,但仍受 deny 约束 | 半信任的自动化任务 |
bypassPermissions |
完全绕过 | 全部不问,YOLO 模式 | 一次性沙盒容器、CI 容器 |
原理要点:模式只控制"兜底行为"。如果你在 settings.json 里写了明确的 allow/deny 规则,规则优先级永远高于模式——被 deny 的操作在任何模式下(包括 bypassPermissions)都会被挡掉;被 allow 的操作在任何模式下都直接放行。模式只对"规则没覆盖到的灰色地带"生效。
新手建议:前两个项目只用 default 模式,认真看完每一次弹窗。等你熟悉了它"想做什么",再升级到 auto。bypassPermissions 在你自己的工作电脑上慎用,最好只留给 Docker 等一次性容器。
光靠模式切换,要么太严(一直问),要么太松(不安全)。真正强大的,是细粒度规则。Claude Code 把每个工具调用都表示成一条规则串,你预先写好放行(allow)、拒绝(deny)、询问(ask)三类清单,就能让安全命令静默、危险命令永远挡住。
| 规则串 | 含义 |
|---|---|
Bash(git status:*) |
允许所有 git status ... 命令 |
Bash(npm run test) |
只允许恰好这条命令 |
Read(./src/**) |
允许读取 src 目录下所有文件 |
Edit(./src/**) |
允许编辑 src 目录下所有文件 |
Write(./pomo.log) |
允许写入这个特定文件 |
WebFetch(docs.anthropic.com) |
允许抓取该域名网页 |
mcp__github__* |
允许某个 MCP 服务器的所有工具 |
其中 * 是通配符,:** 表示"任意参数"。deny 的优先级高于 allow——只要命中 deny,无论是否同时命中 allow,都会被拒绝。
/etc/claude-code/managed-settings.json(Linux)或对应路径,由 IT 管理员锁定,个人改不了。~/.claude/settings.json,对你所有项目生效。.claude/settings.json(可提交到 Git 团队共享)和 .claude/settings.local.json(个人本地,应加入 .gitignore)。新手只需关注用户级和项目级即可。
在项目目录创建 .claude/settings.json:
{
"permissions": {
"allow": [
"Bash(python3:*)",
"Bash(cat:*)",
"Bash(ls:*)",
"Read(./**)",
"Edit(./**)",
"Write(./pomo.log)"
],
"deny": [
"Bash(rm -rf:*)",
"Bash(sudo:*)",
"Bash(curl:*)",
"Read(./.env)",
"Read(./.env/**)",
"Edit(./.env)"
],
"ask": [
"Bash(npm publish:*)",
"Bash(git push:*)"
]
},
"defaultMode": "default"
}
这套配置的含义是:读改项目文件、跑 Python 脚本、看日志都直接放行;删除、提权、外发网络、读写 .env 一律禁止;发布、推送这种对外操作必须问。这正是"既不烦人、又不危险"的舒适区。
现在把理论用起来。我们让 Claude Code 替我们写一个 25 分钟工作 + 5 分钟休息的番茄钟,过程中你会真实经历"弹窗 → 决策 → 永久放行"的完整流程。
cd ~/pomo
claude
确认界面底部显示 (default) 模式。
在提示符后输入:
帮我写一个 Python 番茄钟 pomo.py:工作 25 分钟、休息 5 分钟,倒计时显示在终端,
完成后把每条记录追加写入 pomo.log,格式为"时间 | 类型 | 时长 | 任务名"。
预期结果:Claude Code 思考后会调用 Write 工具创建 pomo.py。此时弹窗出现:
Claude wants to write to ./pomo.py
[1] Yes, and don't ask again for Write in this project
[2] Yes
[3] Yes, and allow all future write/edit operations
[4] No
决策示范:选 1——既允许这次,又把"本项目内写文件"永久放行。这正是规则写入的时刻。文件创建成功后,Claude Code 会显示写入路径与行数。
接着让它运行测试:
跑一下这个脚本,任务名设为"学权限",确认能正常计时并把日志写进去。
预期结果:Claude Code 调用 Bash 工具,弹窗询问是否运行 python3 pomo.py 学权限。注意:为了演示,我们临时把脚本的工作时间改短(见步骤 4),否则要等 25 分钟。在弹窗里选"don't ask again for Bash(python3:*)",把 Python 执行权永久放行。
完整脚本由 Claude Code 生成,核心逻辑如下(你可以对照它写出的版本):
#!/usr/bin/env python3
import time, sys
from datetime import datetime
WORK, BREAK, LOG = 3, 1, "pomo.log" # 演示用 3 秒/1 秒,正式用 1500/300
def countdown(seconds, label):
while seconds:
m, s = divmod(seconds, 60)
print(f"\r{label}: {m:02d}:{s:02d}", end="", flush=True)
time.sleep(1); seconds -= 1
print()
def log(task, kind, minutes):
with open(LOG, "a") as f:
f.write(f"{datetime.now():%Y-%m-%d %H:%M} | {kind} | {minutes}min | {task}\n")
task = sys.argv[1] if len(sys.argv) > 1 else "专注"
countdown(WORK, f"🍅 {task}")
log(task, "work", WORK // 60)
countdown(BREAK, "☕ 休息")
log(task, "break", BREAK // 60)
print(f"✅ 完成!记录已写入 {LOG}")
运行结束后,让它读取日志:
把 pomo.log 的内容显示出来。
预期结果:因为 Read(./**) 已在 allow 列表(或刚被你永久放行),这次不再弹窗,直接输出:
2026-07-09 14:30 | work | 0min | 学权限
2026-07-09 14:30 | break | 0min | 学权限
这就是权限调好之后的畅快感——安全操作静默通过,只在真正有风险时才打断你。
在交互界面输入:
/permissions
会打开一个交互式面板,列出当前所有 allow / deny / ask 规则、来源(用户级/项目级)、当前模式。你可以在这里直接增删规则,而不用手改 JSON。这个命令的别名是 /allowed-tools。
Q1:弹窗太多,思路全被打断了。
→ 在 default 模式下用 Shift + Tab 切到 acceptEdits(自动改文件)或 auto(智能放行安全操作)。再把高频安全命令(git status、npm run test、ls、cat)写进 allow。
Q2:我点了"allow all",现在它开始乱删文件,怎么办?
→ 立即用 /permissions 打开面板,找到过宽的规则(如 Bash(*))删除;或在 deny 里加 Bash(rm:*) 兜底。deny 永远胜过 allow。
Q3:.env 里有密钥,怕它读出去。
→ 把 Read(./.env)、Read(./.env/**)、Edit(./.env)、Bash(cat:.env*) 全写进 deny。这样即便误入 bypassPermissions,密钥也读不到。
Q4:团队项目,规则要共享给同事。
→ 写进 .claude/settings.json 并提交 Git;个人的临时规则写进 .claude/settings.local.json 并加入 .gitignore。
Q5:脚本卡在 25 分钟倒计时,没法快速验证。
→ 演示阶段把 WORK/BREAK 改成秒级(如 3 秒/1 秒),验证逻辑无误后再改回 1500/300。这也是调试倒计时类程序的标准技巧。
Q6:bypassPermissions 到底能不能用?
→ 只在一次性、可丢弃的沙盒环境里用(Docker 容器、CI 临时机器、虚拟机快照)。在装满个人数据的工作电脑上,永远别开——一旦它决定 rm -rf,没人拦得住。
权限系统再灵活,也挡不住人在弹窗前习惯性地点"Yes"。请牢记以下红线——只要弹窗里的命令沾边,立刻选 No:
rm -rf、rm -r、git clean -fd、drop table、truncate。sudo、chmod 777、chown。curl、wget、scp、npm publish、pip upload、git push --force。.env、id_rsa、credentials.json、~/.ssh/**、浏览器 profile。~/Documents、~/Desktop、/etc、/var 而当前项目根本不在那里——说明它可能要越界操作。遇到拿不准的命令,先选 No,再让它解释这条命令会做什么,听懂了再重新放行。记住:Allow 是不可逆的授权习惯,谨慎永远不吃亏。
下图展示一次工具调用从发起到执行/拒绝的完整判定路径。建议存下来,作为你每次面对弹窗时的决策参照:
flowchart TD
A[Claude 发起一次工具调用] --> B{命中 deny 规则?}
B -- 是 --> X[❌ 直接拒绝 不询问]
B -- 否 --> C{命中 allow 规则?}
C -- 是 --> D[✅ 自动放行 静默执行]
C -- 否 --> E{命中 ask 规则?}
E -- 是 --> F[🔔 弹窗询问用户]
E -- 否 --> G{当前权限模式}
G -- default --> F
G -- acceptEdits --> H{是文件编辑类?}
H -- 是 --> D
H -- 否 --> F
G -- plan --> I[🔒 只读 拒绝执行]
G -- auto --> J{操作判定为安全?}
J -- 安全 --> D
J -- 危险 --> F
G -- bypassPermissions --> D
F --> K{用户选择}
K -- Allow once --> D
K -- Allow always --> L[📝 写入 allow 规则]
K -- Deny --> X
L --> D
.claude/settings.json 权限模板。/permissions 交互管理与三层配置优先级的实用指南。[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
