テック技報最新号へ →
AIコーディング

Claude Code: 止めるフックは exit 2、入力は stdin の JSON。違反を起こして止まるのを見るまで「防げる」と書かない

ブロック用のフックが1か月何も止めていなかった例がある。原因は2つで、入力を環境変数から読んでいたことと、exit 1 で終わっていたこと。コマンドフックの入力は stdin に JSON で届き、操作を止めるのは exit 2 だけ。exit 1 は「止めないエラー」として素通りする。

@devoctane · 投稿 2026-10-29
#claude-code#hooks#セキュリティ#検証

どんな時に使う?

  • rm -rf や本番への接続などを PreToolUse フックで止めているつもりでいる
  • AI にフックを書かせ、そのまま「ブロック済み」と CLAUDE.md やチームに伝えようとしている

手順

  1. 入力は stdin から読む: cmd=$(jq -r '.tool_input.command // empty')
  2. 止めるときは理由を stderr に出して exit 2:
    bash
    #!/bin/bash
    cmd=$(jq -r '.tool_input.command // empty')
    if echo "$cmd" | grep -q 'rm -rf'; then
      echo "rm -rf は禁止" >&2
      exit 2
    fi
    exit 0
  3. 実際に違反を起こしてみる: Claude に rm -rf ./tmp-test のような禁止操作を頼み、ブロックされて stderr の理由が表示されるのを確認する
  4. 確認できてから、ドキュメントやルールに「防いでいる」と書く。止まらないときは debug ログ(claude --debug など)でフックの終了コードを見る

注意点

出典

X の元の投稿を開く