一文詳解Claude Code中Hooks的使用
Claude Code 每次調(diào)用工具、等待輸入、結(jié)束會(huì)話,都會(huì)觸發(fā)對(duì)應(yīng)的生命周期事件。你可以在這些事件上掛腳本,拿到上下文 JSON,決定 Claude 要不要繼續(xù)執(zhí)行。
Hooks 是什么
Claude 要調(diào)用工具時(shí),Claude Code 把當(dāng)時(shí)的狀態(tài)打包成 JSON,通過(guò) stdin 傳給你配置的腳本,等腳本退出再繼續(xù)。
整個(gè)流程:

有哪些 Hook 事件
| 事件 | 觸發(fā)時(shí)機(jī) | 能否阻斷 |
|---|---|---|
SessionStart | 會(huì)話開(kāi)始 | 否 |
UserPromptSubmit | 用戶提交了一條消息 | 否 |
PreToolUse | Claude 調(diào)用工具之前 | 是 |
PostToolUse | 工具調(diào)用完成之后 | 否 |
Notification | Claude 需要提醒用戶時(shí) | 否 |
Stop | Claude 完成一輪回復(fù),等待用戶 | 否 |
SessionEnd | 會(huì)話結(jié)束 | 否 |
七個(gè)事件覆蓋一次完整會(huì)話的全過(guò)程:

PreToolUse 是最關(guān)鍵的事件。退出碼決定行為:0 繼續(xù)執(zhí)行,2 阻斷工具調(diào)用,其他非 0 記錄錯(cuò)誤但不阻斷。
怎么配置
打開(kāi) ~/.claude/settings.json,加入 hooks 字段:
{
??"hooks": {
? ??"PreToolUse": [
? ? ? {
? ? ? ??"hooks": [
? ? ? ? ? {
? ? ? ? ? ??"type":?"command",
? ? ? ? ? ??"command":?"python3 /path/to/my_hook.py"
? ? ? ? ? }
? ? ? ? ]
? ? ? }
? ? ],
? ??"Notification": [
? ? ? {
? ? ? ??"hooks": [
? ? ? ? ? {
? ? ? ? ? ??"type":?"command",
? ? ? ? ? ??"command":?"python3 /path/to/notify.py"
? ? ? ? ? }
? ? ? ? ]
? ? ? }
? ? ]
? }
}每個(gè)事件可以配多個(gè)腳本,按順序執(zhí)行。腳本可以是任何可執(zhí)行文件,Python、Shell、Node 都行。
腳本收到什么數(shù)據(jù)
Claude Code 把 JSON 寫(xiě)入腳本的 stdin,不同事件的字段不同。
PreToolUse 示例:
{
??"session_id":?"abc-123",
"hook_event_name":?"PreToolUse",
"tool_name":?"Bash",
"tool_input": {
? ??"command":?"rm -rf /tmp/test"
? },
"cwd":?"/Users/you/myproject",
"tty":?"/dev/ttys001"
}Notification 示例:
{
??"session_id":?"abc-123",
??"hook_event_name":?"Notification",
??"message":?"任務(wù)完成,等待你的下一步指令",
??"cwd":?"/Users/you/myproject"
}Stop 示例:
{
??"session_id":?"abc-123",
??"hook_event_name":?"Stop",
??"cwd":?"/Users/you/myproject"
}腳本還能通過(guò) stdout 影響 Claude
stdin 是 Claude Code 傳給腳本的數(shù)據(jù),stdout 方向相反:腳本輸出 JSON 到 stdout,Claude Code 讀取并按內(nèi)容決策。

PreToolUse:用 stdout 阻斷或放行
腳本可以在 stdout 輸出一個(gè) JSON 對(duì)象,decision 字段控制行為:
import?json, sys
data = json.load(sys.stdin)
if?data.get("tool_name") ==?"Bash":
? ? command = data.get("tool_input", {}).get("command",?"")
? ??if"rm -rf"in?command:
? ? ? ??# 通過(guò) stdout JSON 阻斷
? ? ? ? print(json.dumps({
? ? ? ? ? ??"decision":?"block",
? ? ? ? ? ??"reason":?"禁止執(zhí)行 rm -rf"
? ? ? ? }))
? ? ? ? sys.exit(0) ?# stdout 已表達(dá)意圖,退出碼可以是 0
sys.exit(0)
decision 值為 "block" 時(shí)阻斷,"approve" 時(shí)強(qiáng)制放行(跳過(guò)權(quán)限提示)。
向 Claude 注入上下文
stdout JSON 還支持 additionalContext 字段,內(nèi)容會(huì)直接注入到 Claude 的上下文里,Claude 讀完再?zèng)Q定下一步。適合在工具調(diào)用前后補(bǔ)充環(huán)境信息:
print(json.dumps({
? ??"additionalContext":?"當(dāng)前磁盤(pán)剩余空間 2GB,請(qǐng)謹(jǐn)慎執(zhí)行大文件操作"
}))
sys.exit(0)
動(dòng)手寫(xiě)第一個(gè) Hook
示例 1:記錄 Claude 調(diào)用過(guò)的所有命令
#!/usr/bin/env python3
import?json
import?sys
from?datetime?import?datetime
data = json.load(sys.stdin)
if?data.get("tool_name") ==?"Bash":
? ? command = data.get("tool_input", {}).get("command",?"")
? ??with?open("/tmp/claude_commands.log",?"a")?as?f:
? ? ? ? f.write(f"{datetime.now()}?|?{command}\n")
sys.exit(0) ?# 退出碼 0,Claude 繼續(xù)執(zhí)行
掛在 PostToolUse 上,Claude 每跑完一條 Bash 命令,日志文件就多一行。
示例 2:阻止刪除操作
#!/usr/bin/env python3
import?json
import?sys
data = json.load(sys.stdin)
if?data.get("tool_name") ==?"Bash":
? ? command = data.get("tool_input", {}).get("command",?"")
? ??if?"rm -rf"?in?command:
? ? ? ? print("攔截:禁止執(zhí)行 rm -rf", file=sys.stderr)
? ? ? ? sys.exit(2) ?# 退出碼 2,Claude 放棄這次工具調(diào)用
sys.exit(0)
退出碼 2 是 PreToolUse 的阻斷信號(hào)。Claude 讀到 stderr,把它當(dāng)作拒絕原因展示給用戶,然后停止這次工具調(diào)用。退出碼 1 或其他非 0 值只會(huì)記錄錯(cuò)誤,Claude 仍會(huì)繼續(xù)執(zhí)行。
示例 3:任務(wù)完成時(shí)發(fā)系統(tǒng)通知
#!/usr/bin/env python3 import?json import?sys import?subprocess data = json.load(sys.stdin) subprocess.run([ ? ??"osascript",?"-e", ? ??f'display notification "Claude 完成了,去看看吧" with title "Claude Code"' ]) sys.exit(0)
把這個(gè)腳本掛在 Stop 或 Notification 上。Claude 停下來(lái)等你回復(fù)時(shí),Mac 右上角就會(huì)彈出通知。
示例 4:針對(duì)特定工具設(shè)置 matcher
如果只想監(jiān)聽(tīng)某類工具,加 matcher 字段:
{
??"hooks": {
? ??"PreToolUse": [
? ? ? {
? ? ? ??"matcher":?"Bash",
? ? ? ??"hooks": [
? ? ? ? ? {
? ? ? ? ? ??"type":?"command",
? ? ? ? ? ??"command":?"python3 /path/to/bash_guard.py"
? ? ? ? ? }
? ? ? ? ]
? ? ? }
? ? ]
? }
}加了 matcher,只有 Bash 工具觸發(fā)時(shí)腳本才跑,Edit、Read 等其他工具不走這里。
腳本拿到數(shù)據(jù)后能做什么
寫(xiě)日志:把 Claude 的所有工具調(diào)用記下來(lái),方便復(fù)盤(pán)
發(fā)通知:Claude 等待輸入時(shí),通過(guò)系統(tǒng)通知或微信、釘釘提醒你
阻斷危險(xiǎn)操作:檢測(cè)到高風(fēng)險(xiǎn)命令,退出碼 2 阻止執(zhí)行
轉(zhuǎn)發(fā)事件:把 JSON 發(fā)到本地 socket,驅(qū)動(dòng)自定義 UI 或狀態(tài)面板
記錄耗時(shí):PreToolUse 記開(kāi)始時(shí)間,PostToolUse 記結(jié)束時(shí)間,統(tǒng)計(jì)每類工具的耗時(shí)分布
進(jìn)階:用 Hooks 驅(qū)動(dòng)自定義 UI
Hook 腳本除了做判斷和記錄,還可以把事件轉(zhuǎn)發(fā)到本地 socket,讓一個(gè)常駐進(jìn)程處理所有狀態(tài)變化。

轉(zhuǎn)發(fā)腳本只需幾行:
#!/usr/bin/env python3
import?json, socket, sys
data = sys.stdin.read()
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/tmp/my_app.sock")
sock.sendall((data +?"\n").encode())
response = sock.recv(1024).decode().strip()
sock.close()
# 常駐進(jìn)程返回 "block" 時(shí)阻斷工具調(diào)用(必須用退出碼 2)
sys.exit(2if?response ==?"block"else0)常駐進(jìn)程在 socket 上監(jiān)聽(tīng),收到 PreToolUse 彈出確認(rèn)窗口,用戶點(diǎn)通過(guò)就回 ok,點(diǎn)拒絕就回 block,hook 腳本根據(jù)返回值決定退出碼。這樣就能在 Claude 執(zhí)行過(guò)程中插入任意交互界面,不限于終端。
上手步驟
- 創(chuàng)建你的腳本文件,給執(zhí)行權(quán)限:
chmod +x my_hook.py - 編輯
~/.claude/settings.json,加入 hooks 配置 - 啟動(dòng)一個(gè)新的 Claude Code 會(huì)話(已有會(huì)話需要重啟才能加載新配置)
- 觸發(fā)相關(guān)操作,看腳本是否被調(diào)用
調(diào)試時(shí)在腳本里加 print(json.dumps(data, indent=2), file=sys.stderr) 把收到的完整數(shù)據(jù)打出來(lái),Claude Code 會(huì)把 stderr 輸出顯示在終端。
一個(gè)腳本、一個(gè)退出碼,就能接入 Claude Code 的整個(gè)執(zhí)行流程。你的腳本負(fù)責(zé)判斷邏輯,Claude Code 負(fù)責(zé)觸發(fā)和等待,各管各的。
到此這篇關(guān)于一文詳解Claude Code中Hooks的使用的文章就介紹到這了,更多相關(guān)Claude Code Hooks使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章

2026年Claude Code使用指南:從入門(mén)到IDEA集成實(shí)戰(zhàn)
本文詳細(xì)解析了基于AnthropicSonnet4.5架構(gòu)的ClaudeCode系統(tǒng),包含智能編程代理模型的三層架構(gòu)和核心組件矩陣,文章還展示了微服務(wù)重構(gòu)和CI/CD優(yōu)化等企業(yè)級(jí)應(yīng)用案例,并給出2026-05-29
使用Claude Code自動(dòng)化部署Linux環(huán)境的詳細(xì)過(guò)程
Claude Code 作為智能開(kāi)發(fā)輔助工具,能大幅提升 Linux 環(huán)境下的部署效率,本文以全新虛擬機(jī)為環(huán)境,全程依托 Claude Code 完成 Docker 與 MySQL8.0 的自動(dòng)化安裝,需要的朋友2026-05-28
在Windows系統(tǒng)上配置Claude Code使用DeepSeek API的操作指南
在Windows系統(tǒng)上配置Claude使用使用DeepSeekAPI,需安裝Node.js、配置ClaD環(huán)境及設(shè)置DeepSeekAPI環(huán)境變量,本文詳細(xì)介紹了安裝步驟、配置方法及常用命令,助你快速上手,需要的2026-05-28
2026最新Claude Code開(kāi)發(fā)配置詳細(xì)手冊(cè)
你有沒(méi)有遇到過(guò)這些情況, 每次打開(kāi)新會(huì)話,又要跟 Claude 重新解釋一遍我們項(xiàng)目的命名規(guī)范或者 Claude 突然跑去執(zhí)行了一條危險(xiǎn)命令,下面小編就和大家詳細(xì)介紹一下Claude C2026-05-28
簡(jiǎn)單來(lái)說(shuō),Skill 就是 Claude Code 的專業(yè)技能包,Claude 自帶了一些內(nèi)置 Skill(如代碼審查、安全檢查),你也可以創(chuàng)建自己的自定義 Skill(如文檔格式化),或者安裝別人2026-05-28
一文分享Claude Code中9大神級(jí)Skills的安裝,使用場(chǎng)景和踩坑經(jīng)驗(yàn)
Skills本質(zhì)是「封裝好的專業(yè)提示詞 + 標(biāo)準(zhǔn)化工作流」,相當(dāng)于給 Claude 裝上了「行業(yè)專家大腦」,今天這篇文章,先把親測(cè)好用的 9 個(gè) Skills 分享出來(lái),從安裝到使用場(chǎng)景到2026-05-27
VS Code+Claude Code+Deepseek的使用小結(jié)
本文詳細(xì)介紹了在VSCode中配置ClaudeCode插件并集成Deepseek AI模型的方法,文中通過(guò)圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下2026-05-26
盤(pán)點(diǎn)2026年8大Claude Code Skill深度解析與使用案例指南
本文盤(pán)點(diǎn)了2226年8個(gè)值得使用的的ClaudeSkill,涵蓋前端設(shè)計(jì)、測(cè)試自動(dòng)化、代碼重構(gòu)等關(guān)鍵領(lǐng)域,助開(kāi)發(fā)者提升效率,通過(guò)安裝這些Skill,Claude能更好地理解和執(zhí)行復(fù)雜任務(wù),實(shí)現(xiàn)2026-05-25
Claude Code 是 Anthropic 官方的命令行 AI 編程助手,像在終端里有一個(gè)懂你整個(gè)代碼庫(kù)的高級(jí)工程師,本文給大家介紹Claude Code CLI 使用完整指南,感興趣的朋友跟隨小編一2026-05-21
Claude code相關(guān)的skill是干什么以及有什么作用詳解
Skills是一種可復(fù)用的能力模塊,你可以把它理解成給Claude Code安裝的插件或技能包,這篇文章主要介紹了Claude code相關(guān)的skill是干什么以及有什么作用的相關(guān)資料,文中通過(guò)代2026-05-20











