退出码相同,事件发生的时间不同

Hook返回2的效果要结合事件判断。PreToolUse位于工具执行前,可以阻止这次工具调用;PostToolUse位于工具执行后,此时反馈错误不会把已经产生的修改自动撤销。

本篇聚焦命令Hook的时序,不把HTTP Hook状态码、权限弹窗或系统安全策略混用。配置已保存也不等于Hook在当前会话真正运行。

用一条虚构时间线定位问题

假设任务要把report.txt中的草稿字样改为已审。时刻T1形成工具参数,T2运行PreToolUse,T3工具写文件,T4运行PostToolUse。若T2阻止,工具还没执行;若T4才报告问题,应先检查文件现状。

若你在T4看到stderr里的拒绝说明,能确认的是后置检查给了反馈。不能据此声称T3未发生,或以为系统会自动恢复原文件。这个案例是时序练习,不是本站实际运行Claude Code记录。

exit 2不能让时间倒流;T1:形成工具请求:保存要核对的工具及目标;T2:PreToolUse:在工具执行前作阻止决定;T3:工具执行:文件可能已经发生变化;T4:PostToolUse:反馈问题,不会自动撤销T3
本站原创示意图:exit 2不能让时间倒流。按官方时序整理;未进行Claude Code真实Hook测试。查看大图 ↗

先记录事件名与真实退出码

第一步查配置匹配的事件及工具范围,第二步确认命令确实启动、读取到预期输入,第三步保存退出码、脱敏stderr和时间,第四步核对文件是否变化。只看一句“检查失败”无法定位在哪个阶段。

Windows还需确认所用Shell与可执行程序是否存在。官方文档对启动失败、超时及onFailure有独立规则;脚本根本没启动与脚本主动exit 2并不相同,不能只用错误文案猜。

一份可填写的排查记录

文末模板要求同时记录前后状态、调用证据和未知项。预期记录例:事件PostToolUse,工具已返回,stderr报告缺少审核信息;文件当前值仍需读取。结论应是“后置反馈待处理”,而不是“修改被阻止”。

若想验证前置阻止,在隔离测试目录准备可丢弃样本,先记录内容,再按当前官方设置配置相应事件;触发一次低风险操作后读取文件,核对是否确实未写入。配置、退出码与文件结果三者都需要证据。

不要把Hook写成唯一安全边界

Hook脚本本身也可能出错、匹配范围不完整或在某条路径未触发。需要限制写权限时,还应使用相应权限控制、隔离目录和人工审批;不凭一段字符串匹配承诺封住所有危险命令。

已有修改要恢复时,应先读取当前文件及差异,选择对应恢复方式;不要让后置检查盲目覆盖后来发生的合法修改。本篇没有安装Hook、执行真实Claude Code操作或验证任何生产阻断能力。

参考资料与核验范围

资料核对日期:2026年10月19日。以下为官方原始资料;产品入口和可用范围仍以当前账户为准。

1. [官方资料1](https://code.claude.com/docs/en/hooks)