- Регистрация
- 20.08.2025
- Сообщения
- 62
- Реакции
- 19
Вдохновлен Заметка - Автоматическая проверка сайта на Virustotal с отправкой на почту .
Окрыленный идеей решил нагенерить модификацию скрипта и вот, что у DeepSeek получилось, так как у меня хватило сил и ума только промпт написать.
Запуск в режиме демона (для постоянного мониторинга):
Окрыленный идеей решил нагенерить модификацию скрипта и вот, что у DeepSeek получилось, так как у меня хватило сил и ума только промпт написать.
Bash:
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# === Настройки ===
VT_API_KEY="your_virustotal_api_key"
TELEGRAM_BOT_TOKEN="your_telegram_bot_token"
TELEGRAM_CHAT_ID="your_telegram_chat_id"
URL_TO_CHECK="https://yourwebsite.com"
EMAIL_TO="[email protected]"
TMP_FILE="/tmp/vt_scan_result.txt"
# === Настройки расписания ===
SCAN_SCHEDULE="0 9 * * *" # Каждый день в 9:00 (формат cron)
# SCAN_SCHEDULE="0 */6 * * *" # Каждые 6 часов
# SCAN_SCHEDULE="0 * * * *" # Каждый час
SCAN_INTERVAL=86400 # Интервал в секундах (86400 = 1 день)
# === Функция отправки сообщения в Telegram ===
send_telegram_message() {
local message="$1"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d chat_id="${TELEGRAM_CHAT_ID}" \
-d text="$message" \
-d parse_mode="HTML" > /dev/null
}
# === Функция отправки email ===
send_email() {
local subject="$1"
local body_file="$2"
mail -s "$subject" "$EMAIL_TO" < "$body_file"
}
# === Функция выполнения сканирования ===
perform_scan() {
# === Отправляем URL на скан ===
SCAN_ID=$(curl -s -X POST "https://www.virustotal.com/api/v3/urls" \
-H "x-apikey: $VT_API_KEY" \
--data-urlencode "url=$URL_TO_CHECK" | jq -r '.data.id')
# Проверка: успешно ли отправили
if [ -z "$SCAN_ID" ] || [ "$SCAN_ID" = "null" ]; then
error_msg="Ошибка: не удалось отправить URL $URL_TO_CHECK на проверку VirusTotal"
echo "$error_msg" > "$TMP_FILE"
send_email "VirusTotal scan error" "$TMP_FILE"
send_telegram_message "<b>VirusTotal Error</b>%0A${error_msg}"
return 1
fi
# === Ждём завершения анализа ===
sleep 15
# === Получаем результат ===
REPORT=$(curl -s -X GET "https://www.virustotal.com/api/v3/analyses/$SCAN_ID" \
-H "x-apikey: $VT_API_KEY")
# === Парсим и формируем сообщение ===
URL_ENCODED=$(echo -n "$URL_TO_CHECK" | base64 | tr '+/' '-_' | tr -d '=')
REPORT_URL="https://www.virustotal.com/gui/url/$URL_ENCODED"
# Формируем полный отчет для email
echo "Отчёт VirusTotal для $URL_TO_CHECK" > "$TMP_FILE"
echo "Ссылка на анализ: $REPORT_URL" >> "$TMP_FILE"
echo >> "$TMP_FILE"
echo "$REPORT" | jq -r '.data.attributes.stats | to_entries[] | "\(.key): \(.value)"' >> "$TMP_FILE"
# Формируем краткое сообщение для Telegram
STATS=$(echo "$REPORT" | jq -r '.data.attributes.stats')
MALICIOUS=$(echo "$STATS" | jq -r '.malicious')
SUSPICIOUS=$(echo "$STATS" | jq -r '.suspicious')
UNDETECTED=$(echo "$STATS" | jq -r '.undetected')
HARMLESS=$(echo "$STATS" | jq -r '.harmless')
TELEGRAM_MSG="<b>VirusTotal Scan Report</b>%0A%0A
<b>URL:</b> ${URL_TO_CHECK}%0A
<b>Malicious:</b> ${MALICIOUS}%0A
<b>Suspicious:</b> ${SUSPICIOUS}%0A
<b>Undetected:</b> ${UNDETECTED}%0A
<b>Harmless:</b> ${HARMLESS}%0A
<b>Full report:</b> ${REPORT_URL}"
# === Отправляем уведомления ===
send_email "VirusTotal URL Scan Report: $URL_TO_CHECK" "$TMP_FILE"
send_telegram_message "$TELEGRAM_MSG"
# === Очистка временного файла ===
rm -f "$TMP_FILE"
}
# === Функция расчета времени до следующего сканирования ===
calculate_sleep_time() {
if [[ "$SCAN_SCHEDULE" =~ ^[0-9*\/,-]+[[:space:]]+[0-9*\/,-]+[[:space:]]+[0-9*\/,-]+[[:space:]]+[0-9*\/,-]+[[:space:]]+[0-9*\/,-]+$ ]]; then
# Формат cron - вычисляем время до следующего выполнения
local current_epoch=$(date +%s)
local next_run=$(date -d "$(echo "$SCAN_SCHEDULE" | awk '{print $2" "$1" * * *"}' | xargs -I {} date -d "{}" +"%Y-%m-%d %H:%M:%S" 2>/dev/null)" +%s 2>/dev/null)
if [ -n "$next_run" ] && [ "$next_run" -gt "$current_epoch" ]; then
echo $((next_run - current_epoch))
else
echo "$SCAN_INTERVAL"
fi
else
# Простой интервал в секундах
echo "$SCAN_INTERVAL"
fi
}
# === Основной цикл ===
if [ "$1" = "--once" ]; then
# Однократное выполнение
perform_scan
else
# Режим демона с планировщиком
send_telegram_message "<b>VirusTotal Monitor</b>%0AЗапуск мониторинга URL: $URL_TO_CHECK"
while true; do
perform_scan
SLEEP_TIME=$(calculate_sleep_time)
echo "Следующее сканирование через $SLEEP_TIME секунд"
sleep "$SLEEP_TIME"
done
fi
Основные улучшения (Часть 1):
- Добавлена поддержка Telegram
- Функция send_telegram_message для отправки сообщений через Telegram Bot API 16
- Поддержка HTML-разметки для лучшего форматирования
- Разделение уведомлений
- Подробный отчет отправляется по email
- Краткая сводка отправляется в Telegram
- Улучшенная обработка ошибок
- Ошибки теперь отправляются и в Telegram, и на email
- Форматирование сообщений
- Для Telegram используется краткий формат с ключевой статистикой
- Для email сохраняется полный отчет
- Безопасность
- Добавлена очистка временного файла
Настройка Telegram бота:
- Создайте бота через @BotFather и получите токен 6
- Получите chat ID через запрос к getUpdates 6
- Вставьте полученные значения в переменные TELEGRAM_BOT_TOKEN и TELEGRAM_CHAT_ID
Требования:
- Установленные утилиты: curl, jq, mail
- Доступ к API VirusTotal и Telegram Bot API
Основные улучшения(Часть 2):
- Гибкое планирование сканирования
- Поддержка формата cron через переменную SCAN_SCHEDULE
- Альтернативная настройка через интервал в секундах SCAN_INTERVAL
- Примеры настроек в комментариях
- Два режима работы
- Демон-режим (по умолчанию) - непрерывная работа по расписанию
- Однократный режим (с параметром --once) - для ручного запуска
- Умный расчет времени
- Функция calculate_sleep_time определяет время до следующего сканирования
- Поддержка как cron-формата, так и простых интервалов
- Уведомление о запуске мониторинга
- Отправка сообщения в Telegram при старте мониторинга
- Логирование
- Вывод информации о времени следующего сканирования
Использование:
Настройка расписания (выберите один из вариантов):
Bash:
# Вариант 1: Использование cron-формата
SCAN_SCHEDULE="0 9 * * *" # Каждый день в 9:00
# Вариант 2: Использование интервала в секундах
SCAN_INTERVAL=21600 # Каждые 6 часов
Запуск в режиме демона (для постоянного мониторинга):
Однократный запуск (для тестирования):./virus_total_monitor.sh
Добавление в crontab (альтернативный вариант):./virus_total_monitor.sh --once
# Добавьте эту строку в crontab (crontab -e)
0 9 * * * /path/to/virus_total_monitor.sh --once
Примеры настроек расписания:
- Ежедневно в 9:00: SCAN_SCHEDULE="0 9 * * *"
- Каждый час: SCAN_SCHEDULE="0 * * * *"
- Каждые 6 часов: SCAN_INTERVAL=21600
- Два раза в день (9:00 и 21:00): SCAN_SCHEDULE="0 9,21 * * *"
Последнее редактирование: