首页 游戏 软件 资讯 排行榜 专题
首页
AI
Claude Code Hooks 2026 完整实战指南:六个生产可用的 Hook 场景,附完整脚本和配置

Claude Code Hooks 2026 完整实战指南:六个生产可用的 Hook 场景,附完整脚本和配置

热心网友
77
转载
2026-04-21

Hooks 到底是什么:Agent 生命周期的切面

如果你熟悉 Spring 的 AOP 或者 Git Hooks,那么理解 Claude Code Hooks 就毫不费力了:它允许你在 Agent 执行特定操作的前后,自动触发你预先定义好的逻辑。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

整个生命周期如下图所示:

hook-lifecycle-eventshook-lifecycle-events

其中,PreToolUse是最常用的事件——可以说,90% 的“安全护栏”需求都是在这里实现的。

配置文件放在哪:三级作用域

Hooks 的配置是一个 JSON 对象,需要放在 Claude Code 的 settings 文件里。根据不同的管理需求,有三个位置可供选择:

~/.claude/settings.json              # 全局:对所有项目生效
.claude/settings.json                # 项目级:随代码提交,团队共享
.claude/settings.local.json          # 本地:不提交,仅对自己生效

一个比较推荐的做法是:将通用的安全策略放在全局配置里,而项目特定的规则则放在.claude/settings.json中并提交到代码仓库。

配置文件的基本结构是这样的:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check.sh",
            "timeout": 10
          }
        ]
      }
    ]
  }
}

这是一个三层嵌套结构:事件名 → 匹配器 → 处理器数组。其中,matcher使用正则表达式来匹配工具名,例如Bash只拦截命令行操作,Edit|Write拦截文件修改,mcp__.*则可以拦截所有 MCP 工具的调用。

场景一:拦截危险 Shell 命令

这是最高频的需求。创建一个脚本,专门拦截像rm -rfDROP TABLEgit push --force这类危险操作。

#!/bin/bash
# .claude/hooks/block-dangerous-commands.sh

INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

# 定义危险模式(使用正则匹配)
DANGEROUS_PATTERNS=(
  'rm\s+-rf\s+/'           # rm -rf 根目录或绝对路径
  'git\s+push\s+.*--force' # force push
  'DROP\s+TABLE'           # 删表
  'DROP\s+DATABASE'        # 删库
  'git\s+reset\s+--hard'   # 丢弃未提交修改
  '>\s*/dev/sd'            # 写入磁盘设备
)

for pattern in "${DANGEROUS_PATTERNS[@]}"; do
  if echo "$COMMAND" | grep -iEq "$pattern"; then
    # 退出码 2 = 阻塞性错误,Claude 会收到拒绝通知
    echo "BLOCKED: 命令匹配危险模式 [$pattern]" >&2
    echo "原始命令: $COMMAND" >&2
    exit 2
  fi
done

# 通过检查,允许执行
exit 0

对应的配置如下:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-dangerous-commands.sh",
            "timeout": 5
          }
        ]
      }
    ]
  }
}

这里有个关键细节:退出码的含义可能和直觉不同。退出码1表示非阻塞错误(Claude 会忽略并继续执行),而退出码2才是阻塞错误(Claude 会收到拒绝通知并停止操作)。一开始很容易误用exit 1,结果发现拦截逻辑根本没生效。

场景二:敏感文件保护

防止 Claude 修改.env、密钥文件、锁文件等你不希望被自动工具触碰的文件。

#!/bin/bash
# .claude/hooks/protect-sensitive-files.sh

INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

# 如果没有文件路径(比如 Bash 命令),直接放行
[ -z "$FILE_PATH" ] && exit 0

# 敏感文件模式
PROTECTED_PATTERNS=(
  '\.env$'
  '\.env\.'
  'credentials'
  'secret'
  '\.pem$'
  '\.key$'
  'package-lock\.json$'
  'pnpm-lock\.yaml$'
  'yarn\.lock$'
  'go\.sum$'
)

for pattern in "${PROTECTED_PATTERNS[@]}"; do
  if echo "$FILE_PATH" | grep -iEq "$pattern"; then
    echo "BLOCKED: 不允许修改敏感文件 $FILE_PATH" >&2
    exit 2
  fi
done

exit 0

配置时需要注意,matcher要匹配 Edit 和 Write 两个工具:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-sensitive-files.sh",
            "timeout": 5
          }
        ]
      }
    ]
  }
}

pretooluse-decision-flowpretooluse-decision-flow

场景三:代码修改后自动 Lint

每次 Claude 编辑完文件,自动运行一遍 linter,并将结果反馈给它。这样一来,Claude 就能在同一轮对话中自动修复格式问题。

#!/bin/bash
# .claude/hooks/auto-lint.sh

INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
[ -z "$FILE_PATH" ] && exit 0

# 根据文件类型选择对应的 linter
case "$FILE_PATH" in
  *.js|*.ts|*.jsx|*.tsx)
    RESULT=$(npx eslint --fix "$FILE_PATH" 2>&1) || true
    ;;
  *.py)
    RESULT=$(python -m ruff check --fix "$FILE_PATH" 2>&1) || true
    ;;
  *.go)
    RESULT=$(gofmt -w "$FILE_PATH" 2>&1) || true
    ;;
  *.ja va)
    # 只检查不修复,把问题反馈给 Claude
    RESULT=$(mvn checkstyle:check -pl "$(dirname "$FILE_PATH")" 2>&1 | tail -5) || true
    ;;
  *)
    exit 0
    ;;
esac

# 如果有 lint 问题,将其作为额外上下文反馈给 Claude
if [ -n "$RESULT" ]; then
  jq -n --arg result "$RESULT" --arg file "$FILE_PATH" '{
    hookSpecificOutput: {
      hookEventName: "PostToolUse",
      additionalContext: "Lint 结果 [\($file)]:\n\($result)\n如果有问题请修复。"
    }
  }'
fi

exit 0

注意,这个 Hook 配置在PostToolUse事件上,即在编辑完成之后触发:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/auto-lint.sh",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

场景四:SessionStart 自动注入项目上下文

每次新对话启动时,自动加载 Git 状态、最近的 issue、当前分支等信息,让 Claude 从一开始就掌握项目背景。

#!/bin/bash
# .claude/hooks/inject-context.sh

# 收集项目状态
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")
RECENT_COMMITS=$(git log --oneline -5 2>/dev/null || echo "no commits")
DIRTY_FILES=$(git diff --name-only 2>/dev/null | head -10)
ISSUES=$(gh issue list -L 3 --json title,number --jq '.[] | "#\(.number) \(.title)"' 2>/dev/null || echo "GitHub CLI 不可用")

# 构建上下文
CONTEXT="当前分支: $BRANCH
最近 5 次提交:
$RECENT_COMMITS
未提交的修改:
${DIRTY_FILES:-无}
最近的 Issues:
${ISSUES:-无}"

jq -n --arg ctx "$CONTEXT" '{
  hookSpecificOutput: {
    hookEventName: "SessionStart",
    additionalContext: $ctx
  }
}'

exit 0

配置如下:

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "startup",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/inject-context.sh",
            "timeout": 15
          }
        ]
      }
    ]
  }
}

这个 Hook 有个细节需要注意:SessionStart事件的matcher可以区分startup(新对话)、resume(恢复对话)和compact(上下文压缩后)。通常我们只在startup时加载完整上下文,以避免在resume时重复注入信息。

hook-types-comparisonhook-types-comparison

场景五:异步审计日志

记录 Claude 执行的所有操作,但不阻塞正常流程。关键在于设置"async": true——这意味着异步执行,不会影响 Agent 的响应速度。

{
  "hooks": {
    "PostToolUse": [
      {
        "hooks": [
          {
            "type": "command",
            "async": true,
            "command": "echo \"$(date +%Y-%m-%dT%H:%M:%S) | $(jq -r '.tool_name') | $(jq -r '.tool_input | tostring' | head -c 200)\" >> \"$CLAUDE_PROJECT_DIR\"/.claude/audit.log"
          }
        ]
      }
    ]
  }
}

这里没有设置matcher,意味着所有工具调用都会被记录。日志输出格式类似这样:

2026-04-08T14:23:01 | Edit | {"file_path":"/src/main/ja va/Service.ja va","old_string":"...
2026-04-08T14:23:05 | Bash | {"command":"mvn compile -pl dlm-framework/dlm-rule"}
2026-04-08T14:23:12 | Read | {"file_path":"/src/test/ja va/ServiceTest.ja va"}

一旦出现问题,这份日志就能帮你完整回溯 Claude 的每一步操作。

场景六:HTTP Hook 对接外部合规系统

如果你的团队有独立的合规审核系统(例如安全扫描服务),可以使用 HTTP Hook 在执行前请求外部 API 进行校验:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "http",
            "url": "https://localhost:8080/api/validate-command",
            "headers": {
              "Authorization": "Bearer $COMPLIANCE_TOKEN"
            },
            "allowedEnvVars": ["COMPLIANCE_TOKEN"],
            "timeout": 10
          }
        ]
      }
    ]
  }
}

HTTP Hook 会将工具调用的完整 JSON 数据作为 POST 请求体发送给你的服务。你的服务只需返回{"decision": "block", "reason": "..."}就能拦截该操作。

这在企业环境中特别有用——安全团队可以维护一个中心化的策略服务,所有开发者的 Claude Code 实例都通过 HTTP Hook 与之对接。

进阶:四种 Hook 类型怎么选

Claude Code 支持四种 Hook 类型,各自适用于不同的场景:

90% 的场景使用command类型就足够了。promptagent类型虽然功能强大,但每次触发都会消耗额外的 token,因此不建议在高频事件(如 PostToolUse)上使用。

pretooluse-decision-flowpretooluse-decision-flow

pretooluse-decision-flow

常见问题

Q:Hook 脚本的 stdin 里具体传了什么?

不同工具的输入结构不同。Bash 工具会传入{"tool_input": {"command": "...", "description": "...", "timeout": ...}},而 Edit 工具则传入{"tool_input": {"file_path": "...", "old_string": "...", "new_string": "..."}}。所有 Hook 都会收到session_idcwdpermission_mode等公共字段。可以使用jq -r '.tool_input.command'来提取你需要的特定字段。

Q:Hook 执行失败会怎样?

这取决于退出码。退出码 0 表示成功,退出码 2 表示阻塞(Claude 会停止操作),其他任何退出码(包括 1)都视为非阻塞错误,仅记录到 debug 日志,Claude 会继续执行。这是新手最容易踩的坑——切记不要用exit 1来试图拦截操作。

Q:怎么调试 Hook?

在 Claude Code 中输入/hooks可以查看所有已加载的 Hook 配置。脚本的 stderr 输出会出现在 debug 日志里。建议在开发时,先在终端单独测试脚本:echo '{"tool_input":{"command":"rm -rf /"}}' | bash .claude/hooks/block-dangerous-commands.sh,检查退出码和输出是否符合预期。

Q:Hook 会拖慢 Claude 的执行速度吗?

同步 Hook 会。因此要注意两点:1)设置合理的timeout(默认 600 秒太长了,大多数场景 5-10 秒足够);2)对于不需要阻塞的操作(如审计日志),务必使用"async": true进行异步执行。

Q:能在 Hook 里修改 Claude 的操作参数吗?

可以。PreToolUse的 Hook 可以在 JSON 输出中返回updatedInput字段来修改工具参数。例如,你可以把rm -rf dist/改成rm -rf dist/ --interactive,或者给 Bash 命令自动加上set -e。但需要谨慎使用这个功能——静默修改用户意图可能会造成困惑。

我的建议

Hooks 本质上是给 AI Agent 加 middleware。和 Web 开发里的中间件一样,最好的 Hook 是你写完就忘了它存在——它在背后默默工作,只在真正危险的时候跳出来拦你一下。

一个最小化且实用的配置通常包含三个 Hook:

  1. PreToolUse/Bash:拦截rm -rf--forceDROP等危险模式。
  2. PreToolUse/Edit|Write:保护.env和锁文件等敏感文件。
  3. PostToolUse/Edit|Write(async):自动 lint 并记录审计日志。

这三个 Hook 组合起来,足以覆盖 95% 的“AI 编程事故”场景。剩下的 5%,就交给 Git 来兜底吧。

来源:https://www.51cto.com/article/840703.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

OpenAI Codex重大更新:第二个Claude Code已经来了
AI
OpenAI Codex重大更新:第二个Claude Code已经来了

就在刚刚,OpenAI Codex推出了重大更新,号称Codex 接管一切(Codex for (almost) everything) 行业里一直有种声音,认为Claude Code已经摸到了AGI的门槛,或者说,它本身就是一个“超级应用”的雏形。有趣的是,OpenAI在发布Codex App时,

热心网友
04.21
Claude Design上线:Figma暴跌7%
AI
Claude Design上线:Figma暴跌7%

五个核心能力,一个比一个狠 品牌设计系统,自动构建 第一次使用时,Claude Design 会主动扫描你的代码库和设计文件,自动提取品牌色、字体、组件规范,然后生成一套专属的设计系统。这意味着,之后所有的项目都会自动沿用这套规范,设计师再也不需要为每个项目手动对齐样式了。 四种迭代方式,怎么改都行

热心网友
04.21
布林:谷歌组建团队专攻AI编程,追赶Claude
AI
布林:谷歌组建团队专攻AI编程,追赶Claude

布林亲自挂帅:谷歌组建Gemini精英团队专攻AI编程,全力追赶Anthropic Claude 近期,科技领域一项关键动向引发广泛关注。据权威科技媒体The Information披露,谷歌DeepMind正秘密组建一支由顶尖人才构成的专项团队,其核心使命是大幅提升Gemini大模型的编程能力,旨

热心网友
04.21
留学生使用 Claude 润色论文的避坑指南
AI
留学生使用 Claude 润色论文的避坑指南

留学生使用 Claude 润色论文的避坑指南 不少留学生在用 Claude 润色英文论文时,可能会遇到这样的困扰:改出来的文本虽然语法正确,但总感觉带着一股“AI腔”,术语前后不一,逻辑衔接也略显生硬。这背后的原因,往往不是工具本身的问题,而是提示策略或上下文使用不当。针对这些实际写作场景,我们梳理

热心网友
04.20
Claude Code 开发效率翻倍的十个必备 Slash 命令(附完整使用示例)
业界动态
Claude Code 开发效率翻倍的十个必备 Slash 命令(附完整使用示例)

十个必用的Slash命令:让你的开发效率飙升三倍 如果你正在使用Claude Code(或Claude Projects),那么今天的内容就是为你量身定制的。Claude Code最强大的特性之一,莫过于自定义Slash命令。操作起来非常简单:只需在项目根目录下创建一个 claude command

热心网友
04.20

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

如何制作极具商务高级感的路演PPT 利用Gamma一键定制极简黑金视觉模版
AI
如何制作极具商务高级感的路演PPT 利用Gamma一键定制极简黑金视觉模版

说实话,每次看到别人在商务路演时拿出那种设计精良、气质高端的PPT,你是不是也暗自羡慕过?但咱们既不是专业设计师,又抽不出大把时间琢磨排版配色——这种困境我太懂了。好在现在有了Gamma这样的智能平台,它内置的模板系统能让你快速产出专业级PPT。今天我就以最经典的极简黑金风格为例,带你走一遍具体操作

热心网友
04.21
苹果换帅要大变天了?盘和林:库克不会完全脱离苹果决策层
科技数码
苹果换帅要大变天了?盘和林:库克不会完全脱离苹果决策层

苹果换帅:库克转任执行董事长,硬件负责人特努斯接任CEO 封面新闻记者 易弋力 科技界的一则重磅人事变动,终于在当地时间4月20日尘埃落定。美国苹果公司正式宣布,任命公司内部元老、长期执掌硬件业务的约翰·特努斯为下一任首席执行官,接替自2011年起便掌舵公司的蒂姆·库克。与此同时,苹果公司也确认,库

热心网友
04.21
《三角洲行动》长弓溪谷藏宝堆全点位
游戏攻略
《三角洲行动》长弓溪谷藏宝堆全点位

三角洲行动长弓溪谷藏宝堆位置全攻略 各位特战队员,S9赛季全新登场的“藏宝堆”你们都收集齐了吗?这并非普通的地形装饰,而是地图上带有独特牛角标记的珍贵容器。其背景源于阿萨拉人在收藏大师马苏德引领下开展的祈福仪式,为《三角洲行动》的战场探索增添了丰富的趣味性与文化深度。 《三角洲行动》长弓溪谷藏宝堆全

热心网友
04.21
《刺客信条》多人游戏新作透露定位!聚焦多人PVP!
游戏资讯
《刺客信条》多人游戏新作透露定位!聚焦多人PVP!

育碧近日透露,《刺客信条》系列的全新多人作《刺客信条CODENAME INVICTUS》正在稳步开发中 《刺客信条》的粉丝们,准备好迎接一次碘伏性的体验了吗?育碧不久前释放了一个重磅消息:系列的全新多人游戏《刺客信条CODENAME INVICTUS》正在稳步推进中。这一次,开发团队将重心完全转向了

热心网友
04.21
学科网怎么注册账号_学科网注册账号详细步骤
手机教程
学科网怎么注册账号_学科网注册账号详细步骤

一、访问学科网官网并进入注册页面 想用学科网的各种教学资源,第一步得有个自己的账号。这事儿得从官网走最靠谱,毕竟现在各种山寨网站不少,走错了门,不光注册不成,还可能碰到麻烦。我建议你直接打开浏览器,手动输入www zxxk com这个地址,这样能确保万无一失。 进来之后别眼花,首页内容挺多的。你直接

热心网友
04.21