ХукБезопасность

destructive-guard

Блокирует деструктивные bash-команды: rm -rf, DROP TABLE, git reset --hard. Спрашивает подтверждение.

Закинь в Claude, Cursor или любой AI

Описание

Простым языком

Некоторые команды в терминале необратимы. Удалил не ту папку — данных больше нет. AI иногда уверенно предлагает такие команды. Этот хук как красная кнопка с крышкой: команда блокируется и тебе объясняют почему.

Раньше AI мог выполнить опасную команду сам. Теперь хук перехватывает её и говорит: выполни вручную если уверен. Это даёт тебе секунду подумать.


Что делает

Хук destructive-guard перехватывает деструктивные bash-команды до их выполнения и блокирует их. rm -rf /, DROP TABLE, git reset --hard, docker system prune -a — всё это требует явного подтверждения или блокируется полностью.

AI иногда предлагает "очистить" что-то слишком агрессивно. Этот хук — страховка от команд, которые нельзя отменить.

Когда срабатывает

Триггер: PreToolUse — до выполнения Bash. Условие: команда содержит деструктивные паттерны. Действие: выход с кодом 2 блокирует выполнение.


Установка

  1. Добавь конфиг PreToolUse на Bash в .claude/settings.json
  2. Создай ~/.claude/hooks/destructive-guard.sh с правами chmod +x
  3. Проверь: попроси AI выполнить rm -rf ./temp — должен получить предупреждение

Конфиг settings.json

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/destructive-guard.sh"
          }
        ]
      }
    ]
  }
}

Скрипт хука

#!/bin/bash
# destructive-guard.sh — блокировка деструктивных команд
# PreToolUse: Bash

CMD="${CLAUDE_TOOL_INPUT_COMMAND:-}"
[ -z "$CMD" ] && exit 0

BLOCKED=0

if echo "$CMD" | grep -qE 'rms+(-rf?|-f?r)s+(/|~|$HOME)'; then
  echo "BLOCKED [destructive-guard] rm -rf на корневом пути"
  BLOCKED=1
fi

if echo "$CMD" | grep -qiE 'DROPs+(TABLE|DATABASE|SCHEMA)'; then
  echo "BLOCKED [destructive-guard] DROP TABLE/DATABASE — нужен бэкап"
  BLOCKED=1
fi

if echo "$CMD" | grep -qiE 'TRUNCATEs+TABLE'; then
  echo "BLOCKED [destructive-guard] TRUNCATE TABLE — необратимо"
  BLOCKED=1
fi

if echo "$CMD" | grep -qE 'gits+resets+--hard'; then
  echo "BLOCKED [destructive-guard] git reset --hard потеряет незакоммиченные изменения"
  BLOCKED=1
fi

if echo "$CMD" | grep -qE 'gits+cleans+(-fd|-df)'; then
  echo "BLOCKED [destructive-guard] git clean -fd удалит неотслеживаемые файлы"
  BLOCKED=1
fi

if echo "$CMD" | grep -qE 'dockers+systems+prunes+-a'; then
  echo "BLOCKED [destructive-guard] docker system prune -a удалит ВСЕ образы"
  BLOCKED=1
fi

if echo "$CMD" | grep -qE 'chmods+-Rs+777'; then
  echo "BLOCKED [destructive-guard] chmod -R 777 опасно"
  BLOCKED=1
fi

if [ "$BLOCKED" -eq 1 ]; then
  echo "Если уверен — выполни команду вручную в терминале"
  exit 2
fi

exit 0

Примеры работы

Что пропускает

  • rm file.txt — удаление конкретного файла
  • git reset HEAD~1 — без --hard (staged изменения сохранятся)
  • docker rmi my-image — удаление конкретного образа
  • DROP INDEX — удаление индекса не деструктивно

Что блокирует

  • rm -rf /, rm -rf ~ — корневые пути
  • DROP TABLE users, DROP DATABASE prod
  • git reset --hard HEAD~5 — потеря незакоммиченной работы
  • docker system prune -a --volumes — полная очистка
  • chmod -R 777 /var/www

Настройка под себя

  • Добавь kubectl delete namespace для K8s-проектов
  • Добавь terraform destroy для инфраструктурных проектов
  • Замени exit 2 на интерактивный вопрос для некритичных команд
  • Веди лог заблокированных команд для аудита
Опасные команды должны требовать усилий. Если команда необратима — пусть её выполняет человек с открытыми глазами.
#Hooks#Claude Code#Quality Gates
TG

> Пока нет комментариев

Связанный контент

Похожие инструменты