Claude Code Hooks 实战:用四步拦截任意工具调用,阻止 AI 读你的 .env 文件

4 阅读3分钟

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

0 前言

Claude Code 中的 Hooks 允许你在工具调用执行前或执行后进行拦截和控制,从而可以对 Claude 在开发环境中的行为进行精细化管理。

1 构建 Hook

创建一个 Hook 通常四步:

  1. 选择使用 PreToolUse 或 PostToolUse Hook —— PreToolUse 在工具执行前拦截并阻止调用,而 PostToolUse 在工具执行完成后运行
  2. 确定需要监听的工具类型 —— 你需明确指定哪些工具调用会触发该 Hook
  3. 编写接收工具调用信息的命令 —— 该命令会通过标准输入接收包含工具调用信息的 JSON 数据
  4. (如有需要)向 Claude 提供反馈 —— 通过命令的退出码来告知 Claude 是否允许此次操作

2 可用工具

Claude Code内置工具,你可通过 Hook 监控它们的使用情况。

Tool列表

Tool NamePurpose
ReadRead a file
Edit, MultiEditEdit an existing file
WriteCreate a file and write to it
BashExecute a command
GlobFind files/folders based upon a pattern
GrepSearch for content
TaskCreate a sub-agent to complete a particular task
WebFetch, WebSearchSearch or fetch a particular page

想看当前环境有哪些工具,直接询问 Claude 获取列表。特别是添加自定义 MCP 服务器后,这点尤为有用,因为可用工具可能变化。

$ List out the names of all the tools you haveaccess to, bullet point list.

3 工具调用的数据结构

当 Hook 命令被执行时,Claude 会通过标准输入发送一段 JSON 数据,其中包含此次工具调用的详细信息。

Tool Call Data,命令行中的标准输入:

{
  "session_id": "2d6a1e4d-6...",
  "transcript_path": "/Users/sg/...",
  "hook_event_name": "PreToolUse",
  "tool_name": "Read",
  "tool_input": {
    "file_path": "/code/queries/.env"
  }
}

你的命令需要从标准输入读取这段 JSON,解析其中的信息,然后根据工具名称和输入参数判断是放行还是拦截此次操作。

4 退出码与控制流程

Hook 命令通过退出码向 Claude 反馈执行结果:

flowchart TD
    A["Your command"] --> B["Exit Code 0<br>All is well!"]
    A --> C["Exit Code 2<br>Tool blocked!<br>(PreToolUse only)"]
    C --> D["Stderr logs sent to<br>Claude as feedback"]

    style A fill:#e8d5a9,stroke:#333,strokeWidth:2
    style B fill:#f0f0f0,stroke:#333,strokeWidth:1
    style C fill:#f0f0f0,stroke:#333,strokeWidth:1
    style D fill:#fafafa,stroke:#333,strokeWidth:1
  • 退出码 0 —— 表示一切正常,允许工具调用继续执行
  • 退出码 2 —— 表示阻止该工具调用(仅适用于 PreToolUse Hook)

在 PreToolUse Hook 中以退出码 2 结束时,你写入标准错误输出的任何信息都会被发送给 Claude,用于说明为啥该操作被阻止。

5 示例用法

一个常见的应用场景是阻止 Claude 读取敏感文件,如 .env 文件。由于 ReadGrep 工具都可访问文件内容,你需同时监听这两类工具,并检查它们是否尝试访问受限制的文件路径。

就可全面掌控 Claude 对文件系统的访问,同时也能为被限制的操作提供清晰的反馈说明。本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

0 前言

Claude Code 中的 Hooks 允许你在工具调用执行前或执行后进行拦截和控制,从而可以对 Claude 在开发环境中的行为进行精细化管理。

1 构建 Hook

创建一个 Hook 通常四步:

  1. 选择使用 PreToolUse 或 PostToolUse Hook —— PreToolUse 在工具执行前拦截并阻止调用,而 PostToolUse 在工具执行完成后运行
  2. 确定需要监听的工具类型 —— 你需明确指定哪些工具调用会触发该 Hook
  3. 编写接收工具调用信息的命令 —— 该命令会通过标准输入接收包含工具调用信息的 JSON 数据
  4. (如有需要)向 Claude 提供反馈 —— 通过命令的退出码来告知 Claude 是否允许此次操作

2 可用工具

Claude Code内置工具,你可通过 Hook 监控它们的使用情况。

Tool列表

Tool NamePurpose
ReadRead a file
Edit, MultiEditEdit an existing file
WriteCreate a file and write to it
BashExecute a command
GlobFind files/folders based upon a pattern
GrepSearch for content
TaskCreate a sub-agent to complete a particular task
WebFetch, WebSearchSearch or fetch a particular page

想看当前环境有哪些工具,直接询问 Claude 获取列表。特别是添加自定义 MCP 服务器后,这点尤为有用,因为可用工具可能变化。

$ List out the names of all the tools you haveaccess to, bullet point list.

3 工具调用的数据结构

当 Hook 命令被执行时,Claude 会通过标准输入发送一段 JSON 数据,其中包含此次工具调用的详细信息。

Tool Call Data,命令行中的标准输入:

{
  "session_id": "2d6a1e4d-6...",
  "transcript_path": "/Users/sg/...",
  "hook_event_name": "PreToolUse",
  "tool_name": "Read",
  "tool_input": {
    "file_path": "/code/queries/.env"
  }
}

你的命令需要从标准输入读取这段 JSON,解析其中的信息,然后根据工具名称和输入参数判断是放行还是拦截此次操作。

4 退出码与控制流程

Hook 命令通过退出码向 Claude 反馈执行结果:

flowchart TD
    A["Your command"] --> B["Exit Code 0<br>All is well!"]
    A --> C["Exit Code 2<br>Tool blocked!<br>(PreToolUse only)"]
    C --> D["Stderr logs sent to<br>Claude as feedback"]

    style A fill:#e8d5a9,stroke:#333,strokeWidth:2
    style B fill:#f0f0f0,stroke:#333,strokeWidth:1
    style C fill:#f0f0f0,stroke:#333,strokeWidth:1
    style D fill:#fafafa,stroke:#333,strokeWidth:1
  • 退出码 0 —— 表示一切正常,允许工具调用继续执行
  • 退出码 2 —— 表示阻止该工具调用(仅适用于 PreToolUse Hook)

在 PreToolUse Hook 中以退出码 2 结束时,你写入标准错误输出的任何信息都会被发送给 Claude,用于说明为啥该操作被阻止。

5 示例用法

一个常见的应用场景是阻止 Claude 读取敏感文件,如 .env 文件。由于 ReadGrep 工具都可访问文件内容,你需同时监听这两类工具,并检查它们是否尝试访问受限制的文件路径。

就可全面掌控 Claude 对文件系统的访问,同时也能为被限制的操作提供清晰的反馈说明。