Skip to content

危険なコマンドを実行前に警告する

rm -rfDROP TABLEgit push --force などの危険なコマンドをClaudeが実行しようとしたとき、事前にブロックまたは確認を求めます。

「Claudeが rm -rf node_modules/ と一緒に rm -rf src/ も実行してしまった」という事故を防ぐための安全網です。

Hooks: Claude Codeの特定の操作(ツール実行前後など)に独自のシェルコマンドを自動実行できる設定機能。
{
"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
fi
done
# 警告(実行はするが注意を促す)
for pattern in "${WARNING_PATTERNS[@]}"; do
if echo "$COMMAND" | grep -qi "$pattern"; then
echo "⚠️ 注意が必要なコマンドです: $COMMAND"
echo "意図した操作か確認してください。"
# exit 0 で続行(ブロックしない)
exit 0
fi
done
# 問題なし
exit 0
Terminal window
chmod +x ~/.claude/hooks/check-dangerous-commands.sh

settings.json:

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

.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
fi
fi
exit 0
#!/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 1
fi
# 大量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 "意図した操作か確認してください。"
fi
fi
exit 0
  1. ClaudeがBashツールでコマンドを実行しようとする
  2. PreToolUse Hookが発火
  3. スクリプトが CLAUDE_TOOL_INPUT からコマンドを取得
  4. 危険パターンにマッチする場合は exit 1(ブロック)
  5. Claudeは終了コード1とstdout/stderrを受け取り、「このコマンドはブロックされました」と認識
  6. Claudeは別のアプローチを試みるか、ユーザーに確認を求める
// .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/bash
COMMAND=$(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
fi
fi
デプロイ: 開発したコードを本番サーバーに公開・適用すること。npm: Node.jsのパッケージ管理ツール。`npm install` でライブラリをインストールする。