上周半夜,我们组的线上流水线差点被 AI 生成的测试代码带崩。Claude Code 很懂事地帮我写完业务逻辑后,顺手写了句 DROP TABLE IF EXISTS test_users;,并且静默执行了!吓得我一身冷汗。研究了一夜 Claude Code 最新放出的 Hooks 特性,我得出个结论:生产环境不配 Hooks,等于把数据库直接交到 LLM 手里。

今天我不废话扯概念,直接分享我拿线上流水线试错、提炼出的 6 个生产级 Claude Hook 实战配置。拿去抄进你的 settings.json,立马实现自动化代码审查和安全拦截。


💡 核心认知:Hook 到底拦截了什么?

以前用 AI 写代码,最怕的就是它“自作主张”去跑破坏性脚本,或者写出包含硬编码密钥的烂代码。Claude Code 的 Hooks 机制,本质就是在执行命令(如 Bash)或文件操作(如 Write前中后切面,硬性嵌入我们的“沙盒校验规则”。

下面直接上干货,所有的配置都写在你项目根目录或全局的 ~/.claude/settings.json 里。


🚨 场景一:拦截高危 SQL 与 Shell 命令 (防删库跑路)

这是保命配置!LLM 极易为了图省事,直接执行 DROPDELETE FROM(不带 where)或者 rm -rf。我们必须在命令执行前拦截。

错误写法(不配 Hook,任由 AI 挥霍):
全靠人工盯着终端,一旦眨眼,库就没了。

正确写法(生产级拦截配置):

{
  "hooks": {
    "PreTool": {
      "command": "bash",
      "events": ["Bash"],
      "script": "#!/bin/bash\nINPUT=$(cat)\nCMD=$(echo \"$INPUT\" | jq -r '.command')\nif [[ \"$CMD\" =~ (DROP\\\\s+TABLE|rm\\\\s+-rf|DELETE\\\\s+FROM\\\\s+\\\\w+;\\\\s*$) ]]; then\n  echo \"拦截到高危指令!Command blocked by hook.\" >&2\n  exit 1\nfi"
    }
  }
}

踩坑提示: 这里的正则一定要考虑大小写忽略,AI 经常输出 drop table。一旦匹配成功 exit 1,Claude Code 就会停止执行并向你道歉。


🔒 场景二:AI 提交代码前的密钥扫描 (防信息泄露)

AI 没有安全意识,它在写配置类时,很容易把调试用的 Token 或者内网 IP 直接 Hardcode。

错误写法:
让 Claude 直接 git commit 然后 git push

正确写法(提交前触发扫描脚本):

{
  "hooks": {
    "PreTool": {
      "command": "node",
      "events": ["Bash"],
      "script": "#!/usr/bin/env node\nconst input = JSON.parse(require('fs').readFileSync('/dev/stdin', 'utf8'));\nif(input.command.includes('git commit')){\n  // 这里可以接入 truffleHog 或简单的正则扫描\n  const dangerousRegex = /(sk-[a-zA-Z0-9]{20,})|(password\\\\s*=\\\\s*['\"])/;\n  if(dangerousRegex.test(process.cwd())){ // 伪代码,实际需扫描暂存区\n     console.error('检测到硬编码敏感信息!');\n     process.exit(1);\n  }\n}"
    }
  }
}

🛡️ 场景三:全自动 Linting 格式化 (强制团队代码规范)

团队里有人用 AI 写代码,提交的格式一塌糊涂。我们可以利用 Write 事件,在 AI 每次写完文件后,立刻静默执行 npm run lintmvn spotless:apply

正确写法:

{
  "hooks": {
    "PostTool": {
      "command": "bash",
      "events": ["Write", "Edit"],
      "script": "#!/bin/bash\nINPUT=$(cat)\nFILE=$(echo \"$INPUT\" | jq -r '.arguments.file_path')\nif [[ \"$FILE\" == *.java ]]; then\n  mvn spotless:apply -q\nelif [[ \"$FILE\" == *.ts ]]; then\n  npx eslint --fix \"$FILE\" --quiet\nfi"
    }
  }
}

⚙️ 场景四:自动生成依赖审计日志 (合规溯源)

企业级 Java 项目要求合规,AI 引入的每一个新 Maven 依赖,都必须留痕。

正确写法(监听 pom.xml 修改):

{
  "hooks": {
    "PostTool": {
      "command": "bash",
      "events": ["Write"],
      "script": "#!/bin/bash\nINPUT=$(cat)\nFILE=$(echo \"$INPUT\" | jq -r '.arguments.file_path')\nif [[ \"$(basename $FILE)\" == \"pom.xml\" ]]; then\n  echo \"[$(date)] AI 修改了 pom.xml\" >> /var/log/claude_code_audit.log\n  git diff $FILE >> /var/log/claude_code_audit.log\nfi"
    }
  }
}

🚦 场景五:CI/CD 闸门 (禁止直推主干)

AI 跑自动化任务时,如果你让它自己合并代码,它可不管你是不是在 main 分支。

正确写法(Bash 执行前置校验):

{
  "hooks": {
    "PreTool": {
      "command": "bash",
      "events": ["Bash"],
      "script": "#!/bin/bash\nINPUT=$(cat)\nCMD=$(echo \"$INPUT\" | jq -r '.command')\nif [[ \"$CMD\" =~ git\\\\s+push ]] && [[ \"$CMD\" =~ (main|master) ]]; then\n  echo \"禁止直接推送到主干!请走 MR 流程。\" >&2\n  exit 1\nfi"
    }
  }
}

📊 场景六:模型越狱/幻觉监控报警

AI 长时间跑微服务重构时容易产生幻觉(比如凭空捏造一个不存在的内部方法)。我们可以监听它的日志输出,当遇到 File not found 或编译报错超过 3 次时,直接打断它。

(具体配置可结合自身监控平台定制,监听 Notification 事件即可实现)


💬 你怎么看?
在接入 AI 编码助手时,你们团队的 CI/CD 流水线是怎么防“暴走”的?

  1. 彻底物理隔离: 禁止 AI 拥有任何终端执行权限,只做代码补全。
  2. 只读沙盒: 像 Claude Code 这种,只给它读写代码权限,严禁触网和执行构建。
  3. 像本文一样: 依靠 Hook 拦截危险指令,让它在受限环境里最大化发挥能动性。
    评论区说说你们公司的做法,看看大家都是怎么排雷的?

落地工作流总结

  1. 最小权限原则:把上面的 PreTool 拦截脚本放在第一位,先保底。
  2. 格式化后置PostTool 里的格式化脚本执行要快,否则严重影响 AI 交互响应时间(建议用轻量级 lint 而不是全量构建)。
  3. 日志分离:AI 自动化操作产生的日志,务必单独打文件,不要和人工提交混在一个 Git Log 里。

如果这 6 个生产级 Hook 配置救了你的命,点个赞和收藏再走吧!这对我写硬核干货是巨大的鼓励。
下一篇预告:《Cursor vs Claude Code 深度对比:企业级重构任务,到底谁在裸泳?》关注我,第一时间获取更新!你在用 AI 写代码时还踩过什么离谱的坑?我们在评论区接着聊!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐