危険なコマンドを実行前に警告する
何をするHooksか
Section titled “何をするHooksか”rm -rf、DROP TABLE、git push --force などの危険なコマンドをClaudeが実行しようとしたとき、事前にブロックまたは確認を求めます。
「Claudeが rm -rf node_modules/ と一緒に rm -rf src/ も実行してしまった」という事故を防ぐための安全網です。
※Hooks: Claude Codeの特定の操作(ツール実行前後など)に独自のシェルコマンドを自動実行できる設定機能。
settings.json の実際のコード
Section titled “settings.json の実際のコード”シンプルなブロック設定
Section titled “シンプルなブロック設定”{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "COMMAND=$(echo $CLAUDE_TOOL_INPUT | jq -r '.command'); if echo \"$COMMAND\" | grep -qE '(rm -rf|drop table|truncate|--force|format [A-Z]:)'; then echo \"危険なコマンドが検出されました: $COMMAND\"; exit 1; fi" } ] } ] }}より詳細なチェックスクリプト
Section titled “より詳細なチェックスクリプト”~/.claude/hooks/check-dangerous-commands.sh:
#!/bin/bash
COMMAND=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.command')
# デバッグログ(任意)# echo "$(date): チェック対象: $COMMAND" >> /tmp/claude-command-log.txt
# 危険なコマンドのパターン定義declare -a DANGEROUS_PATTERNS=( "rm -rf /" "rm -rf \*" "rm -rf \$" ":(){:|:&};:" # Fork bomb "dd if=/dev/zero" "mkfs\." "> /dev/sda" "chmod -R 777 /" "chown -R")
declare -a WARNING_PATTERNS=( "rm -rf" "git push --force" "git push -f" "git reset --hard" "DROP TABLE" "DROP DATABASE" "TRUNCATE" "DELETE FROM.*WHERE" "UPDATE.*SET.*WHERE")
# 完全ブロック(実行させない)for pattern in "${DANGEROUS_PATTERNS[@]}"; do if echo "$COMMAND" | grep -qi "$pattern"; then echo "❌ 危険なコマンドをブロックしました。" echo "コマンド: $COMMAND" echo "パターン: $pattern" echo "" echo "このコマンドを実行する場合は、手動でターミナルから実行してください。" exit 1 fidone
# 警告(実行はするが注意を促す)for pattern in "${WARNING_PATTERNS[@]}"; do if echo "$COMMAND" | grep -qi "$pattern"; then echo "⚠️ 注意が必要なコマンドです: $COMMAND" echo "意図した操作か確認してください。" # exit 0 で続行(ブロックしない) exit 0 fidone
# 問題なしexit 0chmod +x ~/.claude/hooks/check-dangerous-commands.shsettings.json:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "~/.claude/hooks/check-dangerous-commands.sh" } ] } ] }}本番環境の誤操作を防ぐ設定
Section titled “本番環境の誤操作を防ぐ設定”.env の内容を読んで本番環境かどうかを判定するパターン:
#!/bin/bash
COMMAND=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.command')
# 環境を確認if [ -f "$CLAUDE_PROJECT_DIR/.env.local" ]; then NODE_ENV=$(grep NODE_ENV "$CLAUDE_PROJECT_DIR/.env.local" | cut -d= -f2)fi
# 本番環境での破壊的操作をブロックif [ "$NODE_ENV" = "production" ]; then if echo "$COMMAND" | grep -qE '(DELETE|DROP|TRUNCATE|rm -rf)'; then echo "❌ 本番環境での破壊的操作はブロックされています。" echo "コマンド: $COMMAND" echo "" echo "本番での操作が必要な場合は:" echo "1. バックアップを確認する" echo "2. チームリーダーに確認する" echo "3. 手動で実行する" exit 1 fifi
exit 0データベース操作の保護
Section titled “データベース操作の保護”#!/bin/bash
COMMAND=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.command')
# DROP TABLE / DROP DATABASE のチェックif echo "$COMMAND" | grep -qiE '(DROP\s+TABLE|DROP\s+DATABASE|TRUNCATE)'; then echo "❌ テーブル削除・切り捨て操作がブロックされました。" echo "" echo "実行しようとしたコマンド:" echo "$COMMAND" echo "" echo "データベース変更を行う場合は:" echo "1. まずバックアップを取る: pg_dump -U postgres dbname > backup.sql" echo "2. ステージング環境で確認する" echo "3. 手動でデータベースに接続して実行する" exit 1fi
# 大量UPDATE/DELETEの警告if echo "$COMMAND" | grep -qiE '(UPDATE|DELETE)\s+\w+\s+(SET|WHERE)'; then # WHERE句なしのUPDATE/DELETEは特に危険 if echo "$COMMAND" | grep -qiE '(UPDATE|DELETE)\s+\w+\s+SET(?!\s*.*WHERE)'; then echo "⚠️ WHERE句のないUPDATE/DELETE操作です。全レコードが影響を受けます。" echo "意図した操作か確認してください。" fifi
exit 0- ClaudeがBashツールでコマンドを実行しようとする
- PreToolUse Hookが発火
- スクリプトが
CLAUDE_TOOL_INPUTからコマンドを取得 - 危険パターンにマッチする場合は
exit 1(ブロック) - Claudeは終了コード1とstdout/stderrを受け取り、「このコマンドはブロックされました」と認識
- Claudeは別のアプローチを試みるか、ユーザーに確認を求める
カスタマイズ例
Section titled “カスタマイズ例”チームの禁止コマンドリスト
Section titled “チームの禁止コマンドリスト”// .claude/settings.json(プロジェクト固有){ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "COMMAND=$(echo $CLAUDE_TOOL_INPUT | jq -r '.command'); if echo \"$COMMAND\" | grep -q 'npm publish'; then echo 'npm publishは手動で行ってください(CIを通じて行うルール)'; exit 1; fi" } ] } ] }}深夜・週末の本番デプロイをブロック
Section titled “深夜・週末の本番デプロイをブロック”#!/bin/bashCOMMAND=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.command')HOUR=$(date +%H)DAY=$(date +%u) # 1=月曜, 7=日曜
# 深夜(22時〜8時)または週末のデプロイをブロックif echo "$COMMAND" | grep -q 'deploy\|helm upgrade\|kubectl apply'; then if [ "$HOUR" -ge 22 ] || [ "$HOUR" -lt 8 ] || [ "$DAY" -ge 6 ]; then echo "❌ 深夜・週末のデプロイはブロックされています。" echo "平日9時〜22時に実行してください。" exit 1 fifi※デプロイ: 開発したコードを本番サーバーに公開・適用すること。※npm: Node.jsのパッケージ管理ツール。`npm install` でライブラリをインストールする。