Hook 跟 Permission
客製化 Claude 行為跟設安全界線
⏱ 預估 ~6 分鐘
01 · 讀一讀
Hook 讓你在 Claude 流程特定時刻跑你自己的程式。工具跑前?編輯後?session 開始時?你能攔截這些事件加你自己邏輯 — 自動格式化、安全檢查、通知、自訂驗證。
Permission 控制 Claude 被允許做什麼。預設 Claude 跑指令或編檔前問。但你可以預先核准安全動作(像 npm test)、擋危險的(像 git push --force),讓 Claude 在例行任務跑更快、有風險的保持安全。
💡 想像一下Hook 像生產線上的檢查點。每個站,檢查員(你的腳本)檢查工作、揮過(exit 0)或送回(exit 2)。Permission 像安全證系統 — 有些門永遠開(讀檔)、有些要刷證(指令)、有些鎖著(危險操作)。
重點整理
- Hook:在 Claude 流程特定時刻跑你的程式
- Permission:控制 Claude 能跟不能做什麼
- Hook 攔截事件;permission 設總體規則
- 一起為你流程客製化跟保護 Claude
02 · 讀一讀
下面是最有用的 hook 事件:- PreToolUse — Claude 用工具前(Read、Edit、Bash 等)觸發。你可以檢查它要做什麼、擋它。 - PostToolUse — 工具成功後觸發。適合自動格式化編輯的檔或記錄改動。 - SessionStart — session 開始時觸發。用來注入 context 提醒,特別在壓縮後。 - Notification — Claude 需要你注意時觸發。適合桌面通知。 - Stop — Claude 回應完時觸發。
Hook 透過 exit code 溝通:exit 0 表示允許動作,exit 2 表示擋它(你 stderr 的錯誤訊息變成 Claude 的回饋)。
重點整理
- PreToolUse:工具跑前檢查、選擇性擋
- PostToolUse:工具成功後反應(自動格式化、記錄)
- SessionStart:session 開始或壓縮後注入 context
- Exit 0 = 允許、Exit 2 = 擋(stderr 變回饋)
03 · 看程式碼
下面是 PostToolUse hook,Claude 編檔後自動格式化。住你專案的 .claude/settings.json。
.claude/settings.json — 自動格式化 hook
{
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}]
}]
}
}
matcher 欄位用 regex 配對工具名 — Edit|Write 表示這 hook 在任何 Edit 或 Write 工具呼叫後觸發。指令在 stdin 收 JSON,有工具呼叫細節,抽出檔路徑、對它跑 Prettier。Claude 編的每個檔都自動格式化。
04 · 看程式碼
下面是 PreToolUse hook,擋危險 Bash 指令。
.claude/hooks/protect.sh
#!/bin/bash
INPUT=$(cat)
CMD=$(echo "$INPUT" | jq -r '.tool_input.command')
if [[ "$CMD" =~ "rm -rf" ]]; then
echo "Blocked: rm -rf is not allowed" >&2
exit 2 # Block the action
fi
exit 0 # Allow everything else
.claude/settings.json
{
"hooks": {
"PreToolUse": [{
"matcher": "Bash",
"hooks": [{
"type": "command",
"command": ".claude/hooks/protect.sh"
}]
}]
}
}
這 hook 攔截 Claude 試跑的每個 Bash 指令。它從 stdin 讀指令(當 JSON)、檢查有沒有 'rm -rf'、用 exit code 2 擋。stderr 的錯誤訊息告訴 Claude 為什麼被擋,Claude 會接受限制。
05 · 讀一讀
Permission 給你總體允許/拒絕規則不用寫腳本。它們用萬用字元彈性配對。
Allow 規則 預先核准動作,讓 Claude 不用問:- Bash(npm run ) — 任何 npm script - Bash(git commit ) — commit 改動 - Read(*.env) — 讀 env 檔
Deny 規則 完全擋動作:- Bash(git push --force ) — 不准強推 - Edit(package-lock.json) — 不要碰 lockfile - Bash(rm -rf ) — 不准遞迴刪
Deny 規則永遠贏 allow 規則。設定從最具體到最不具體檢查:local project > project > user。
重點整理
- Allow 規則:預先核准安全動作(無 permission 提示)
- Deny 規則:完全擋動作
- 萬用字元:Bash(npm *) 配對任何 npm 指令
- Deny 衝突時永遠贏 allow
- 本機設定蓋過專案蓋過使用者
06 · 選擇題
你 PreToolUse hook 偵測到 Claude 要跑 rm -rf /tmp/build。你 hook 腳本該回什麼 exit code 擋這動作?
- Exit code 0 — 成功
- Exit code 2 — 擋動作
- Exit code 1 — 一般錯誤
- Exit code 255 — 嚴重錯誤
07 · 配對
配對每個 hook 事件到最適合什麼。
(本節為互動練習,請啟用 JavaScript 體驗)
⚠ 完整互動體驗需要 JavaScript。請啟用 JavaScript 後重新整理。
※ 本站為獨立繁中教學專案,非 Anthropic 官方產品。Claude™ 為 Anthropic, PBC 商標。