主流 Agent 入门教程 / Claude Code
25. 附录6-安全检查与验收清单
原文备份 · 第 27 / 28 篇 · 查看极客时间原知识库 ↗
本篇目录 · 33 节
来源:Claude Code
核对日期:2026-09-30
适用范围:Claude Code 命令行中的个人项目、课程练习、批量修改和claude -p自动化。
这不是要求每次都走一套重流程。小改动使用“十项快速门禁”;涉及删除、批量数据、网络、密钥、插件、MCP、无人值守或发布时,再展开对应专项清单。
勾选只代表“已经检查并有证据”,不代表“让 Claude 说已经完成”。证据可以是命令输出、测试报告、磁盘文件、Git Diff、真实运行结果或人工观察。
一、十项快速门禁
开始前
pwd或 PowerShell 的Get-Location显示正确项目,而不是主目录、磁盘根目录或原始课程素材目录。git status --short已保存;已有修改的归属清楚,不会被覆盖、回退或混入本次任务。- 目标、允许修改路径、禁止修改路径和完成标准都能用一句话说明。
- 重要文件已有 Git 提交、练习副本或独立备份;
/rewind不是唯一恢复方案。
执行中
- 每次批准前看到了完整工具、参数、工作目录、目标路径和外部副作用。
- 权限只覆盖当前必需动作;没有把“免审批”“提示词只读”或 Bare Mode 当成安全隔离。
- 安装依赖、联网、写外部服务、产生费用、提交、推送、发布和删除都获得了明确授权。
交付前
- 目标测试、完整回归和至少一条真实用户路径都实际运行过,并记录命令、退出码和关键结果。
git diff --check、git diff --stat和/diff或git diff没有无关重构、密钥、调试残留或意外大文件。- 最终报告区分“已验证”“未验证”“已知限制”,并给出恢复入口。
如果任一项答不上来,先暂停当前动作,不要靠扩大权限、重跑模型或跳过检查继续。
二、开始前:保护现场
1. 确认目录和起始状态
macOS、Linux 或 WSL2:
pwd
git status --short
git rev-parse --show-toplevel
Windows PowerShell:
Get-Location
git status --short
git rev-parse --show-toplevel
通过标准:项目根目录与任务描述一致;现有修改已识别。git rev-parse 报错表示当前不是 Git 仓库,此时必须明确使用副本或备份,而不是假装可以用 Git 回滚。
2. 识别敏感数据和外部副作用
- 提示词、截图、日志和测试夹具中没有真实 API Key、Cookie、Token、身份证号、地址或私人内容。
.env、凭据目录、SSH Key 和云配置的读取规则已检查。- 网络目标、账户、数据用途和可能费用明确。
- 任务是否会发消息、改数据库、创建云资源、推送或发布已写清。
- 练习只使用课程提供的假数据,不把个人真实数据复制进夹具。
只把密钥放进当前进程环境或合适的 Secret 管理中;不要写进提示词、脚本、仓库、Shell 历史或教程截图。日志只记录密钥名称和是否存在,不输出值。
3. 选择恢复方式
| 任务 | 最小恢复措施 |
|---|---|
| 单个代码改动 | 起始 git status + 可审查 Diff |
| 未提交个人数据 | 独立副本或备份,再操作副本 |
| 批量迁移 | 清单 + Dry Run + 小批量 + 回滚映射 |
| 外部写操作 | 测试账户/沙箱 + 幂等键或撤销步骤 |
| 课程练习 | 从 exercise-assets/ 重新复制干净副本 |
/rewind 可以帮助回到对话检查点,但不能替代 Git、文件备份、数据库快照,也不能撤销已经发生的外部副作用。
三、批准工具调用前
看到审批提示时,逐项检查:
- 工具名称和完整输入可见,没有只根据 Claude 的解释批准。
- 当前工作目录和所有相对路径已确认。
- 命令没有未解释的管道、重定向、命令替换、通配符或包装器。
- 删除、覆盖、移动、递归操作的精确目标已由只读命令确认。
git clean、git reset、强制推送、数据库写入和云资源操作有单独授权。- 网络域名、上传内容、认证身份和费用明确。
- “本次允许”足够时,没有选择跨会话永久放行。
权限规则的顺序是 deny、ask、allow。Allow 表示匹配调用可免提示,不表示其他工具消失。命令文本规则也不是完整 OS 安全边界:同一程序可能用绝对路径、Shell 包装器或另一种参数形式调用。需要文件系统和网络边界时,应启用并验证 Sandbox。
在会话中用 /permissions 查看规则来自哪个设置文件。项目中的永久批准通常会写入 .claude/settings.local.json;审批后再检查 git status --short,避免把本地授权意外提交。
四、五个最容易误判的安全开关
| 选项 | 实际作用 | 不能据此声称 |
|---|---|---|
--allowedTools |
预批准匹配的工具调用 | “只剩这些工具” |
--tools |
限制模型可见的内置工具集合 | “MCP 也被一并禁用” |
--permission-mode dontAsk |
拒绝原本需要询问且未预批准的调用 | “所有工具都不能运行” |
--bare |
跳过大部分自动发现的自定义项和常规凭据加载 | “只读”“Sandbox”“安全模式” |
--safe-mode / --restricted |
各自提供不同的精简或受限运行环境 | “不需要再限制工具、MCP 和输出” |
Bare Mode 专项检查
Bare Mode 仍可拥有 Bash、Read、Edit 等内置工具。使用前确认:
- 真正需要的内置工具已用
--tools明确列出;不需要时传--tools ""。 - 不需要 MCP 时额外使用
--disallowedTools "mcp__*",或采用严格的 MCP 配置。 - 无人回答审批时使用
--permission-prompts none,并确认必要调用已被安全预批准。 - 认证由受控环境显式注入;真实 Key 不在命令文本、文件或日志中。
- 输出仍经过 Schema、确定性脚本或人工复核,而不是因 Bare Mode 自动变可信。
仅写下面这条命令,不能证明安全或只读:
claude --bare -p "检查项目"
受限只读调查的思路应同时覆盖工具集合、MCP、审批和输出,例如:
claude -p "根据已提供的输入输出 JSON;不要猜测缺失事实" \
--tools "" \
--disallowedTools "mcp__*" \
--permission-mode dontAsk \
--permission-prompts none \
--output-format json
这段示例没有内置工具,适合从标准输入或提示词接收已脱敏事实;它不是读取项目的模板。若需要读取仓库,应显式添加 Read,Glob,Grep,并在隔离副本中验证实际访问边界。
五、代码改动验收
范围
- 改动文件都能映射到一个需求或必要测试。
- 没有顺手重构、批量格式化、升级依赖或改公共接口。
- 原有未提交修改仍在,且与本次 Diff 可区分。
- 生成文件、缓存、日志和临时数据没有混入交付。
行为
- 新功能有正常、边界和错误行为的验收。
- 缺陷修复有稳定复现;回归测试在修复前失败、修复后通过。
- 目标测试和完整测试实际通过;没有用跳过、重试、吞错或扩大超时掩盖问题。
- 至少运行一次真实入口,而不是只运行单元测试。
- 旧数据、旧命令或旧接口的兼容性已按任务要求验证。
独立证据
git diff --check
git diff --stat
git status --short
预期:git diff --check 退出码为 0;统计和状态只出现预期文件。随后查看完整 Diff,并运行项目指定的测试和真实入口。
不要把“Claude 已检查”“代码看起来正确”或一次成功截图当成完整回归证据。
六、数据与批量操作
- 先只读盘点总数、类型、异常和明确排除项。
- 第一次在副本、独立分支或测试数据上执行。
- Dry Run 列出逐项计划,不写文件、不触发外部动作。
- 缺字段、格式冲突、解析失败和符号链接有明确处理规则。
- 小批量通过后才全量;批次边界和结果有记录。
- 验收同时检查数量、结构、正文/数据完整性和受保护项。
- 第二次 Dry Run 显示 0 个待改,证明幂等。
- 回滚命令或 before/after 映射已在全量前验证。
- 删除只针对已解析并核对的精确目标,不使用宽泛变量或未展开通配符。
批量任务的最小证据链是:
盘点 -> Dry Run -> 小批量 -> 小批量验收 -> 全量 -> 全量验收 -> 幂等 -> 回滚入口
旅行笔记的完整示例见第 16 篇。
七、Skills、Hooks 与 Subagents
Skill
description足够具体,不会和其他 Skill 大面积重叠。- 有副作用的 Skill 默认使用
disable-model-invocation: true,由用户显式触发。 $ARGUMENTS、允许的输入、预期输出和失败行为已验证。allowed-tools没有被误当成全局工具白名单。/skills能发现;修改后使用/reload-skills或新会话复核。
Hook
- matcher 命中精确工具或事件,不会意外覆盖所有动作。
- 处理器可在 Claude Code 之外独立运行。
- 正常、警告、阻止和脚本故障的退出行为都已测试。
- 输出不泄露密钥、私人路径或完整用户数据。
- 不会因自己写日志或修改文件形成自触发循环。
- 已记录
/hooks中的停用入口和配置恢复方法。
Subagent
- 任务足够独立,且并行收益大于用量和协调成本。
- 工具、MCP、权限模式、模型和可访问文件按最小范围设置。
- 多个 Agent 不会同时修改同一文件或依赖同一未完成结果。
- 返回结果包含文件位置、实际命令、事实、假设和未验证项。
- 主 Agent 或人工对关键结论做了独立复核。
完整实操分别见第 11 篇和第 13 篇。
八、MCP 与插件供应链
MCP 服务和插件可能运行本地代码、读取环境变量、连接网络或向 Claude 暴露带副作用的工具。安装成功不等于来源可信。
添加前
- 来源、维护者、版本和下载位置可核对。
- 阅读了 manifest、Hook、MCP 启动命令和安装脚本。
- 没有
curl | sh、隐藏下载、宽泛文件访问或不必要的高权限。 - 凭据使用测试账户和最小 scope,不写入仓库。
- 外部服务的数据保留、费用和写操作边界已知。
第一次运行
- 优先本地、只读、假数据或测试账户。
- 用
/mcp确认连接的是预期服务。 - 第一个工具调用无副作用,并独立核对结果来源。
- 插件先运行
claude plugin validate <路径> --strict,再用--plugin-dir临时加载。 - Skill、Agent 和 MCP 使用预期命名空间,没有覆盖同名项目配置。
结束后
- 写工具未继续开放;不用的服务已 disable、disconnect 或 remove。
- 临时凭据撤销,测试数据和本地进程清理。
/context、/mcp或插件详情证明没有意外残留。- 安装或配置产生的文件都出现在预期 Diff 中。
可运行的本地只读 MCP 和临时插件见第 12 篇。
九、claude -p 与无人值守自动化
无人值守意味着没人临场判断模糊审批,所以必须在启动前完成限制和验证。
- 使用
--tools建立真正的内置工具集合,而不是只写--allowedTools。 - 用
--disallowedTools "mcp__*"或严格配置处理 MCP;--tools不控制 MCP。 - 使用
--permission-mode dontAsk与--permission-prompts none,并测试被拒绝路径。 - 设置
--max-budget-usd、外层超时和最大输入大小。 - 机器消费的结果使用
--json-schema;另有本地校验器检查业务语义。 - 捕获退出码、标准错误、超时、预算耗尽和部分输出。
- 日志已经脱敏,不包含提示词中的私人数据或环境变量值。
- 自动化默认不提交、推送、合并、发布或写生产服务。
- 失败不会误报成功;下游只接收验证通过的结果。
Schema 只证明输出形状正确,不能证明事实正确。最稳妥的结构是“确定性采集器产生事实 → Claude 做受约束映射 → 确定性校验器比对事实”。完整示例见第 14 篇。
十、课程练习的重置与验收
课程素材是只读起点,不要直接在 exercise-assets/ 中练习。
- 原素材目录仍存在,
git status --short没有显示素材被改。 - 每次练习先复制到文章指定的新目录;若目标已存在,先检查内容,不直接覆盖。
- 复制后运行该素材自带的完整性或阶段验证脚本。
- 失败基线与文章写明的失败数、退出码或关键输出一致。
- 练习完成后运行目标验收、完整回归和真实入口。
- 需要重来时删除或归档的是明确的练习副本,不是原素材或整个工作区。
如果基线与文章不同,先停止修改,检查复制来源、当前目录、Python 版本和是否混入上次练习文件。不要让 Claude“修到和教程一样”,那会抹掉真正的起始状态问题。
十一、最终交付记录
完成时至少留下下面六类信息:
改动:具体文件和用户可见行为
保留:没有触碰的范围与已有修改
验证:实际运行的命令、退出码、通过数和真实结果
安全:权限、网络、凭据、费用与外部副作用
恢复:Git、备份、重置或撤销入口
未验证:受环境、账号或平台限制而未完成的项目
最终再问自己:
- 一个新读者能从磁盘证据复核结果,而不用相信当前对话吗?
- 删除当前会话后,项目仍能通过文档、测试和 Git 说明状态吗?
- 失败时能在不扩大损失的情况下回到已知状态吗?
三项都为“是”,才算完成。
十二、关键排错
/permissions 与预期不一致
查看规则来自哪个 settings 文件,并记住 deny > ask > allow。本地永久批准可能在 .claude/settings.local.json;修改后从下一次工具调用开始验证,不要只读配置文本推断。
Sandbox 已开,命令仍能访问不该访问的位置
先运行 /sandbox 检查状态和边界;确认是否在原生 Windows、是否通过已允许的外部进程间接访问、是否添加过额外目录或网络白名单。权限审批和 Sandbox 是两层控制,不能只检查其中一层。
自动化一直报权限错误
不要改成 bypassPermissions。先核对 --tools、权限规则、dontAsk 与 --permission-prompts none,再让 Dry Run 打印最终参数。必要工具应该被精确预批准;非必要工具应移除。
插件或 MCP 行为异常
先停用新增组件,保留日志和配置 Diff;再从 manifest、启动命令、作用域、连接状态和首个只读工具逐层恢复。不要同时重装插件、改 MCP 配置和扩大权限。
十三、官方资料
官方行为会随版本变化。遇到命令或界面差异时,以本机 claude --help、对应子命令 --help、会话内 /help 和当前官方文档为准。