上周半夜,我们组的线上流水线差点被 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 极易为了图省事,直接执行DROP、DELETE 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 lint或mvn 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 流水线是怎么防“暴走”的?
- 彻底物理隔离:禁止 AI 拥有任何终端执行权限,只做代码补全。
- 只读沙盒:像 Claude Code 这种,只给它读写代码权限,严禁触网和执行构建。
- 像本文一样:依靠 Hook 拦截危险指令,让它在受限环境里最大化发挥能动性。
评论区说说你们公司的做法,看看大家都是怎么排雷的?
落地工作流总结
- 最小权限原则:把上面的
PreTool拦截脚本放在第一位,先保底。 - 格式化后置:
PostTool里的格式化脚本执行要快,否则严重影响 AI 交互响应时间(建议用轻量级 lint 而不是全量构建)。 - 日志分离:AI 自动化操作产生的日志,务必单独打文件,不要和人工提交混在一个 Git Log 里。
如果这 6 个生产级 Hook 配置救了你的命,点个赞和收藏再走吧!这对我写硬核干货是巨大的鼓励。
下一篇预告:《Cursor vs Claude Code 深度对比:企业级重构任务,到底谁在裸泳?》关注我,第一时间获取更新!你在用 AI 写代码时还踩过什么离谱的坑?我们在评论区接着聊!