Skip to content
←INDEX / 提示詞庫
TUTORIAL/Claude Code/進階

Claude Code Hook 食譜:PreToolUse 攔截危險 bash(rm -rf/fork bomb/curl|sh)

掛一個 PreToolUse Bash hook,在 AI 執行 shell 指令「之前」就攔下 rm -rf、fork bomb、curl|sh 這類毀滅性命令——連 --dangerously-skip-permissions 都擋得住的最後一道安全網。

SakuyaPromptCraft 主筆 · 寫於 2026-06-08
AI 教學 / 腳本Claude Code進階≈ 583 tokens · 實際用量依工具與輸入而異
Last reviewed2026-06-08Read~11 MIN

01PROMPT

# 目標:在 Claude Code 執行任何 Bash 指令「之前」攔截毀滅性命令
# 放到 .claude/settings.json(專案)或 ~/.claude/settings.json(全域,建議全域,全專案都保護)。
# 機制:PreToolUse hook 在工具執行前觸發;hook 從 stdin 收 JSON,
#       讀 tool_input.command 去比對危險 pattern;命中就 exit 2 → Claude Code 取消該動作。
#       這層連 --dangerously-skip-permissions 也擋得住,是真正的最後防線。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash {{PROJECT_DIR}}/.claude/hooks/block-dangerous-commands.sh"
          }
        ]
      }
    ]
  }
}

# ---- .claude/hooks/block-dangerous-commands.sh ----
# chmod +x 後使用。命中危險 pattern:印理由到 stderr 並 exit 2(= 拒絕,AI 會看到原因)。
#!/usr/bin/env bash
set -euo pipefail

cmd=$(jq -r '.tool_input.command // empty')
[ -z "$cmd" ] && exit 0

deny() { echo "🛑 已被安全 hook 攔截:$1" >&2; echo "   指令:$cmd" >&2; exit 2; }

# 安全等級:critical(只擋毀系統)/ high(再加強推、reset --hard)/ strict(最謹慎)
SAFETY_LEVEL="{{SAFETY_LEVEL}}"   # 建議先用 high

# --- critical:任何等級都擋 ---
echo "$cmd" | grep -Eq 'rm[[:space:]]+(-[a-zA-Z]*[rR][a-zA-Z]*[fF]|-[a-zA-Z]*[fF][a-zA-Z]*[rR])([[:space:]]|$)' && deny "遞迴強制刪除(rm -rf)"
echo "$cmd" | grep -Eq 'rm[[:space:]]+.*[[:space:]](/|~|\$HOME|/\*)([[:space:]]|$)' && deny "對根目錄/家目錄刪除"
echo "$cmd" | grep -Eq ':\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;\s*:' && deny "fork bomb"
echo "$cmd" | grep -Eq '(curl|wget)[^|]*\|[[:space:]]*(sudo[[:space:]]+)?(ba)?sh' && deny "下載直接執行(curl|sh / wget|sh)"
echo "$cmd" | grep -Eq '(mkfs|>[[:space:]]*/dev/sd|dd[[:space:]]+if=.*of=/dev/)' && deny "直接寫入/格式化磁碟裝置"
echo "$cmd" | grep -Eq 'chmod[[:space:]]+-R[[:space:]]+777[[:space:]]+/' && deny "對根目錄 chmod 777"

# --- high:再加常見「無法復原」操作 ---
if [ "$SAFETY_LEVEL" = "high" ] || [ "$SAFETY_LEVEL" = "strict" ]; then
  echo "$cmd" | grep -Eq 'git[[:space:]]+push[[:space:]]+.*(--force|-f)([[:space:]]|$)' && deny "git 強制推送(可能覆蓋遠端歷史)"
  echo "$cmd" | grep -Eq 'git[[:space:]]+reset[[:space:]]+--hard' && deny "git reset --hard(丟棄未提交變更)"
  echo "$cmd" | grep -Eq 'git[[:space:]]+clean[[:space:]]+-[a-zA-Z]*[fd]' && deny "git clean -fd(刪除未追蹤檔案)"
fi

# --- strict:連批次刪除、sudo rm 都提醒 ---
if [ "$SAFETY_LEVEL" = "strict" ]; then
  echo "$cmd" | grep -Eq 'sudo[[:space:]]+rm' && deny "sudo rm(提權刪除)"
  echo "$cmd" | grep -Eq 'find[[:space:]]+.*-delete' && deny "find ... -delete(批次刪除)"
fi

exit 0   # 沒命中 → 放行

把方括號 [ ] 內的變數換成你的內容,丟進 Claude Code。

◆ 直接開到工具Claude(記得貼)
RUN站內試跑 / TRY IT
▶ 站內試跑

不用離開網站,直接看這組 prompt 跑出來長怎樣(AI 即時生成,扣 1 點)。

SKILL安裝成 SKILL / INSTALL
安裝成 SKILLClaude Code Agent Skill

不只複製貼上 — 下載後放到 ~/.claude/skills/hook-block-dangerous-bash-pretooluse-guardrail/SKILL.md,之後每個 session 自動可用(觸發時自動載入)。

macOS / Linux
mkdir -p ~/.claude/skills/hook-block-dangerous-bash-pretooluse-guardrail && mv ~/Downloads/SKILL.md ~/.claude/skills/hook-block-dangerous-bash-pretooluse-guardrail/SKILL.md
Windows PowerShell
New-Item -ItemType Directory -Force "$env:USERPROFILE\.claude\skills\hook-block-dangerous-bash-pretooluse-guardrail" | Out-Null; Move-Item "$env:USERPROFILE\Downloads\SKILL.md" "$env:USERPROFILE\.claude\skills\hook-block-dangerous-bash-pretooluse-guardrail\SKILL.md"

02CONTEXT / 使用情境

## 這是什麼/解決什麼痛點 你願意讓 Claude Code 自動跑 bash 來提升效率,但有一類指令一旦執行就回不來:`rm -rf /`、`rm -rf ~`、fork bomb、`curl http://… | sh`、`dd if=… of=/dev/sda`。靠「每次都人工核准」太累、也容易手滑按過;而 `--dangerously-skip-permissions`(YOLO 模式)更是完全沒煞車。這個 PreToolUse hook 補上真正的最後防線:在 AI 把任何 bash 指令送去執行「之前」,先掃描危險 pattern,命中就以 exit code 2 拒絕、把理由回給 AI——關鍵是這層連 `--dangerously-skip-permissions` 都擋得住,因為 hook 是 harness 強制執行的,不歸 AI 的權限旗標管。 ## 為什麼這來源值得用 本食譜改寫自 karanb192/claude-code-hooks(MIT)的 `block-dangerous-commands` hook,它正是為這個情境而生:PreToolUse 鎖 `Bash` matcher、從 stdin 的 JSON 讀 `tool_input.command`、命中危險 pattern 就 exit 2 拒絕,並提供 critical / high / strict 三段安全等級。我把它的核心邏輯用純 bash 重寫(原專案是 Node 腳本),讓沒有 Node 的環境也能直接用,並保留「分級」設計,這樣你可以先用寬鬆的 critical,團隊習慣後再升到 high / strict。 ## 怎麼用(步驟) 1. 把 JSON 併進 `~/.claude/settings.json`(建議放全域,讓每個專案都被保護)。 2. 建立 `.claude/hooks/block-dangerous-commands.sh`,貼上腳本並 `chmod +x`。 3. 確認有 `jq`(用來解析 stdin JSON)。 4. 把 `{{SAFETY_LEVEL}}` 設成 `high`(推薦起點)。 5. 測試:叫 AI 跑一個無害的 `rm -rf /tmp/this-should-be-blocked-xyz`,應看到被 hook 拒絕、AI 收到理由並改用安全做法。 ## 要點與何時用 - **exit 2 才是「拒絕」**:PreToolUse hook 用 exit code 2 表示阻擋,並把 stderr 內容回給 AI 當理由;exit 0 是放行。這跟 PostToolUse 完全不同(後者擋不了已執行的動作)。 - **pattern 要保守、寧可漏放也別誤殺**:太激進的 regex 會把正常指令也擋掉、讓 AI 卡住。先擋「明確毀滅性」的,再依團隊習慣加碼。 - **它是安全網、不是替代品**:仍建議在重要 repo 用版控與備份;hook 防的是「手滑與失控」,不是惡意攻擊。 - **何時用**:任何你打算開 auto-approve / YOLO 模式、或讓 AI 在含有真實資料的環境跑 shell 的場景,都應該先掛這層。 📎 來源:karanb192/claude-code-hooks(作者 Karan Bansal,MIT 授權)— 本篇改寫自其 block-dangerous-commands hook(含 critical/high/strict 分級設計),以純 bash 重寫並繁中說明,原始內容見上方連結。

04VARIABLES / 變數說明

01[PROJECT_DIR]

hook 腳本所在路徑;放全域時可改用 ~/.claude/hooks/... 的絕對路徑

02[SAFETY_LEVEL]

安全等級:critical(只擋毀系統)/high(加 git 強推、reset --hard,推薦)/strict(最謹慎)

05RESOLVER · 變數代入器0 / 2

填下面的欄位,上方 prompt 會即時替換 [方括號] 內容。填好後按「複製組好的 prompt」直接丟進工具。

修飾
Assembled · 填剩餘變數…
# 目標:在 Claude Code 執行任何 Bash 指令「之前」攔截毀滅性命令
# 放到 .claude/settings.json(專案)或 ~/.claude/settings.json(全域,建議全域,全專案都保護)。
# 機制:PreToolUse hook 在工具執行前觸發;hook 從 stdin 收 JSON,
#       讀 tool_input.command 去比對危險 pattern;命中就 exit 2 → Claude Code 取消該動作。
#       這層連 --dangerously-skip-permissions 也擋得住,是真正的最後防線。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash {{PROJECT_DIR}}/.claude/hooks/block-dangerous-commands.sh"
          }
        ]
      }
    ]
  }
}

# ---- .claude/hooks/block-dangerous-commands.sh ----
# chmod +x 後使用。命中危險 pattern:印理由到 stderr 並 exit 2(= 拒絕,AI 會看到原因)。
#!/usr/bin/env bash
set -euo pipefail

cmd=$(jq -r '.tool_input.command // empty')
[ -z "$cmd" ] && exit 0

deny() { echo "🛑 已被安全 hook 攔截:$1" >&2; echo "   指令:$cmd" >&2; exit 2; }

# 安全等級:critical(只擋毀系統)/ high(再加強推、reset --hard)/ strict(最謹慎)
SAFETY_LEVEL="{{SAFETY_LEVEL}}"   # 建議先用 high

# --- critical:任何等級都擋 ---
echo "$cmd" | grep -Eq 'rm[[:space:]]+(-[a-zA-Z]*[rR][a-zA-Z]*[fF]|-[a-zA-Z]*[fF][a-zA-Z]*[rR])([[:space:]]|$)' && deny "遞迴強制刪除(rm -rf)"
echo "$cmd" | grep -Eq 'rm[[:space:]]+.*[[:space:]](/|~|\$HOME|/\*)([[:space:]]|$)' && deny "對根目錄/家目錄刪除"
echo "$cmd" | grep -Eq ':\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;\s*:' && deny "fork bomb"
echo "$cmd" | grep -Eq '(curl|wget)[^|]*\|[[:space:]]*(sudo[[:space:]]+)?(ba)?sh' && deny "下載直接執行(curl|sh / wget|sh)"
echo "$cmd" | grep -Eq '(mkfs|>[[:space:]]*/dev/sd|dd[[:space:]]+if=.*of=/dev/)' && deny "直接寫入/格式化磁碟裝置"
echo "$cmd" | grep -Eq 'chmod[[:space:]]+-R[[:space:]]+777[[:space:]]+/' && deny "對根目錄 chmod 777"

# --- high:再加常見「無法復原」操作 ---
if [ "$SAFETY_LEVEL" = "high" ] || [ "$SAFETY_LEVEL" = "strict" ]; then
  echo "$cmd" | grep -Eq 'git[[:space:]]+push[[:space:]]+.*(--force|-f)([[:space:]]|$)' && deny "git 強制推送(可能覆蓋遠端歷史)"
  echo "$cmd" | grep -Eq 'git[[:space:]]+reset[[:space:]]+--hard' && deny "git reset --hard(丟棄未提交變更)"
  echo "$cmd" | grep -Eq 'git[[:space:]]+clean[[:space:]]+-[a-zA-Z]*[fd]' && deny "git clean -fd(刪除未追蹤檔案)"
fi

# --- strict:連批次刪除、sudo rm 都提醒 ---
if [ "$SAFETY_LEVEL" = "strict" ]; then
  echo "$cmd" | grep -Eq 'sudo[[:space:]]+rm' && deny "sudo rm(提權刪除)"
  echo "$cmd" | grep -Eq 'find[[:space:]]+.*-delete' && deny "find ... -delete(批次刪除)"
fi

exit 0   # 沒命中 → 放行
SOURCE / 來源歸屬
FAQ · 常見問題

「Claude Code Hook 食譜:PreToolUse 攔截危險 bash(rm -rf/fork bomb/curl|sh)」這組提示詞要怎麼用?

這組 prompt 專為 Claude Code 設計。把 prompt 內 2 個方括號 [變數] 換成你自己的內容,貼進 Claude Code 執行即可。難度中等,照變數說明填好後即可上手。

「Claude Code Hook 食譜:PreToolUse 攔截危險 bash(rm -rf/fork bomb/curl|sh)」是免費的嗎?

完整 prompt 免費開放閱讀,不用註冊;可保存瀏覽器收藏,登入後可一鍵複製與留言。

用 Claude Code 依這組 prompt 生成的成果可以商用嗎?

prompt 文字本身你可自由使用與修改。但 AI 生成物(圖/音樂/影片/文字)的商用授權,取決於你在 Claude Code 使用的方案與其官方服務條款,請以該工具的授權規範為準。

RELATED你可能也需要

PRO01
TUTORIALSuno v5.5FEATURED
r/SunoAI (anonymous studio engineer)2026-06-12

Suno 工程師思維:4 步驟做出不像 AI 的歌

5.0(1)

Studio engineer 視角拆解 Suno 致命弱點(油炸 vocals、高頻 artifact)+ 4 步驟 DAW workflow + Suno Studio 修音 prompt

高階
Read

免費02
TUTORIALClaude 4.5 SonnetFEATURED
r/ClaudeAI2026-05-14

5 個 6 月 stuck 下來的 Claude 每週 workflow

提案產生器 / 會議處理器 / 內容再利用 / 週五回顧 / 收工 reset — 試了 40 個只有這 5 個沒被丟掉、各省 30+ 分鐘 / 次。

進階
Read

PRO03
TUTORIALClaude 4.5 SonnetFEATURED
r/PromptEngineering2026-05-14

7 個跨 model A/B 測過的 prompt 技巧(不是 vibes)

六個月在 Claude / GPT-4 / Gemini 上用人工 rater A/B 測 200+ prompt 後寫的。包含 persona+constraint stacking / anti-example / role reversal QA / cognitive scaffold / emotional priming / uncertainty CoT / steelman first。

高階
Read

免費04
TUTORIALChatGPTFEATURED
r/ChatGPTPromptGenius2026-05-14

5 個信任檢查單行 prompt(沒有 role-play)

一年的 role-play system prompt + 14-step framework 後總結:真正改變品質的是 5 個單行 prompt。沒有 role、沒有 markdown、沒有「you are an expert」。

入門
Read

免費 · 全文開放閱讀

完整 prompt 已經開放.

免登入閱讀全文、保存瀏覽器收藏;登入後可一鍵複製與留言討論。不用信用卡。

不想註冊?

留個 email,下次有新 prompt 會寄一封簡短摘要給你。退訂一鍵、不轉賣。

每週一期,新上架提示詞 + 模型測試心得。每封信底部都有一鍵取消訂閱。

或訂 RSS feed(30 秒一次的人味選擇)

COMMENTS · 討論區0 則
登入 後可留言。還沒帳號?註冊
目前沒有留言。第一個說說你的經驗。
EMBED · 嵌入 blog / Note一行 iframe HTML、貼進文章即顯示此 prompt 卡片+

適合:部落格、Medium、Notion 公開頁、Substack — 任何支援 iframe / HTML 嵌入的地方。對方點「看完整」會回到本站、是 prompt 庫的免費 backlink。

<iframe src="https://prompt.luvai.net/embed/claude-code-hook-block-dangerous-bash-pretooluse-guardrail" width="100%" height="380" frameborder="0" style="border:1px solid #e0dcd0;border-radius:4px;" loading="lazy" title="PromptCraft Embed"></iframe>
預覽 embed →380px tall · responsive width
發現這個 prompt 過時 / 跑不動 / 有錯字? 回報給我們 →