展开本页目录
开始前准备什么
- Claude Code 可用账号或 API 调用另计费;本页未调用目标模型。
- 需本机 shell、可执行 Hook 脚本及 JSON 解析能力;按实际安装版验证配置。
- 只覆盖匹配的 Edit/Write,不覆盖 Bash 等其他写文件途径,不宣称系统级文件保护。
- 先把保护对象限定为练习文件
- 配置 PreToolUse 的工具匹配
- 用精确文件名保留配置示例例外
- 让 Claude 分别提出四种编辑请求
- 先独立跑允许和拒绝正反例
- 回读源文件与原生会话日志
- 记录覆盖范围后再迁移配置
原创输入、提示词、原生配置、参考源码、实际结果和验收说明;不含模型账号或运行缓存。
按独立目录运行,原生代理会话需由自己另行执行。
1. 先把保护对象限定为练习文件
解压后先读 fake-files.json:里面的 .env 和 .env.example 都是虚构种子,verify.py 只在临时目录创建它们。把 .claude/settings.json 和 protect.py 放进你自己的独立 Claude Code 练习项目,切勿拿真实密钥目录试错。
2. 配置 PreToolUse 的工具匹配
在项目 .claude/settings.json 的 hooks → PreToolUse 中设 matcher 为 Edit|Write,command 指向 python3 "$CLAUDE_PROJECT_DIR"/.claude/hooks/protect.py。脚本从标准输入读取 tool_name 和 tool_input.file_path;相对路径必须先按项目目录归一化。
3. 用精确文件名保留配置示例例外
检查脚本:.env、package-lock.json 等精确文件名返回 exit 2,.env.example 不在名单中。不要用 startswith(".env") 把示例文件一起拦住;脚本还拒绝解析后逃出练习根目录的 Edit/Write 路径。
4. 让 Claude 分别提出四种编辑请求
进入项目启动 Claude Code,先要求 Edit 修改虚构 .env,再要求 Write 覆盖锁文件,然后修改 .env.example 与 app.txt。观察原生 Hook 阻断反馈和工具实际输入;不要为了通过测试授权其他工具绕过保护。
5. 先独立跑允许和拒绝正反例
在解压目录运行 python3 verify.py。它用真正子进程传入五份工具输入,验证退出码 2/2/0/0/0,并保存 result.json;第五项 Bash 返回 0 是刻意展示未覆盖的边界,不是保护成功。
本地练习命令
python3 verify.py6. 回读源文件与原生会话日志
核对 result.json 的 shaBefore/shaAfter 完全相同,因为独立检查器没有实际执行写文件。Claude 会话中另行确认被拒请求未改文件、放行请求确实改了练习文件;两种证据不要混为一次执行。
7. 记录覆盖范围后再迁移配置
整理匹配工具、精确文件名、项目根目录、阻断提示及绕过边界。此 Hook 只约束匹配的 Edit/Write;Bash、其他工具或操作系统写入仍需单独约束,不能把它描述成系统级文件权限。
怎样确认已经完成
- Hook 子进程五例退出码及源 SHA应能按 README 在独立目录重现。
- 目标代理真实结果须另存;人工参考、原生会话和官方示例分别识别。
常见问题
Claude Code 怎么阻止 AI 改到密钥文件?
检查脚本:.env、package-lock.json 等精确文件名返回 exit 2,.env.example 不在名单中。不要用 startswith(".env") 把示例文件一起拦住;脚本还拒绝解析后逃出练习根目录的 Edit/Write 路径。
锁文件不让 AI 改,配置示例还能正常编辑吗?
核对 result.json 的 shaBefore/shaAfter 完全相同,因为独立检查器没有实际执行写文件。Claude 会话中另行确认被拒请求未改文件、放行请求确实改了练习文件;两种证据不要混为一次执行。
本题哪些结果已经实际运行?
已运行的是Hook 子进程五例退出码及源 SHA。原生功能操作按官方文档编排,目标代理未调用;英文检索可用“Claude Code PreToolUse hooks protect files allow env example”定位对应术语,但这不是搜索量或热榜声明。




