Bash + Telegram: мониторинг сервера и мгновенные уведомления
Данная статья написана для людей, имеющих базовые знания по работе с Linux. В этой статье будет рассказано о том, как написать bash-скрипт для отправки мгновенных уведомлений об активности на сервере в Telegram. Я постараюсь объяснить данную тему доступным языком и предоставить практические примеры, чтобы вы могли легко применить полученные знания на практике. Telegram глубоко проник в нашу жизнь. Это уже не просто мессенджер, а огромная экосистема, с различными каналами, приложениями, магазинами и играми. Мы храним в нем заметки, совершаем покупки, общаемся с друзьями и коллегами. Так почему бы не использовать его как рабочий инструмент, для отслеживания активности на нашем сервере? С чего все началось. У меня есть VPS, где я тестирую и разворачиваю свои pet-проекты. Для защиты своего сервера установил стандартную программу fail2ban и как же я был неприятно удивлен, посмотрев логи, что каждый день, делается до 500 попыток подключиться ко мне по ssh. Читатель может сказать, добавь ключи, отключи доступ по ssh и проблема решена. Однако, это не всегда удобно, да и данной статьи бы не было, если бы я все это сделал. И для мониторинга такой активности было решено написать небольшой скрипт, который будет посылать уведомления со статистикой о неудачных и удачных попытках входа. Что нам потребуется: Установить fail2ban Установить curl Создать telegram бота, получить его токен и chat_id (это идентификатор чата, куда нам будут приходить сообщения) Для начала установим fail2ban и curl sudo apt update sudo apt install fail2ban curl Рис. 1 Команды для установки fail2ban и curl Хочу отметить, что после установки Fail2ban не настроен по умолчанию для активной защиты. Однако, он уже включает в себя некоторые предустановленные конфигурации и фильтры, которые можно использовать. Если вы хотите подробнее узнать о его работе, то обратитесь к официальном сайте. Создадим пустой файл в каталоге touch ~/usr/local/bin/telegram_notification.sh Рис. 2 Команда для создания пустого файла Приступим к написанию самого скрипта #!/bin/bash # Замените на ваш токен и chat_id TOKEN="123456789:ABCDEFGHIJKLMN_OPQRSTUVWXYZ123456" CHAT_ID="987654321" # Функция для отправки сообщения в Telegram send_telegram_message() { local message="$1" curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \ -d "chat_id=$CHAT_ID" \ -d "text=$message" \ -d "parse_mode=HTML" } # Переменная для отслеживания времени последнего уведомления о неудачных попытках и блокировках last_failed_time=0 # Время (1 день) через которое следует посылать уведомления о неудачных попытках входа track_time_range=86400 # Функция для проверки и отправки уведомлений о неудачных попытках и блокировках check_failed_attempts() { current_time=$(date +%s) # Проверка, прошло ли больше суток с последнего уведомления if (( current_time - last_failed_time >= track_time_range )); then # Получаем информацию о неудачных попытках и блокировках за последние сутки failed_attempts=$(grep "Failed password" /var/log/auth.log | wc -l) bans=$(grep "Ban" /var/log/fail2ban.log | wc -l) # Формируем сообщение message=" Статистика за последние сутки:\n" message+=" Неудачных попыток входа: $failed_attempts\n" message+=" Заблокированных IP: $bans" # Отправляем сообщение send_telegram_message "$message" last_failed_time=$current_time fi } # Отслеживание логов аутентификации и Fail2Ban tail -F /var/log/auth.log /var/log/fail2ban.log | while read line; do # Проверка на успешные попытки входа if echo "$line" | grep "Accepted password" &> /dev/null; then send_telegram_message "✅ Успешный вход: $line" fi # Проверка на неудачные попытки входа if echo "$line" | grep "Failed password" &> /dev/null; then check_failed_attempts fi # Проверка на заблокированные IP-адреса if echo "$line" | grep "Ban" &> /dev/null; then check_failed_attempts fi done Рис. 3 Скрипт, отвечающий за отправку статистики с уведомлениями Данный скрипт, достаточно понятен. Стоит только заострить свое внимание на нескольких моментах, а именно на tail -F /var/log/auth.log /var/log/fail2ban.log | while read line; Рис. 4 Команда tail отвечающая за отображения последних строк текстового файла Команда tail -F отслеживает все изменения в log файлах и через pipe (|) передает их в цикл while, где изменения записываются в переменную line. В дальнейшем, цикл пробегается по условиям и формирует статистику неудачных попыток входа, а в случае удачной попытки, сообщение об этом немедленно отправляется в телеграмм. Теперь осталось запустить данный скрипт. Для простоты, воспользуемся командой nohup. Эта команда позволяет запускать процессы, игнорируя сигнал HUP (hangup). Это полезно, когда вы хотите, чтобы процесс продолжал работать даже после выхода из системы или закрытия терминала. Однако, лучшей а

Данная статья написана для людей, имеющих базовые знания по работе с Linux. В этой статье будет рассказано о том, как написать bash-скрипт для отправки мгновенных уведомлений об активности на сервере в Telegram. Я постараюсь объяснить данную тему доступным языком и предоставить практические примеры, чтобы вы могли легко применить полученные знания на практике.
Telegram глубоко проник в нашу жизнь. Это уже не просто мессенджер, а огромная экосистема, с различными каналами, приложениями, магазинами и играми. Мы храним в нем заметки, совершаем покупки, общаемся с друзьями и коллегами. Так почему бы не использовать его как рабочий инструмент, для отслеживания активности на нашем сервере?
С чего все началось. У меня есть VPS, где я тестирую и разворачиваю свои pet-проекты. Для защиты своего сервера установил стандартную программу fail2ban и как же я был неприятно удивлен, посмотрев логи, что каждый день, делается до 500 попыток подключиться ко мне по ssh. Читатель может сказать, добавь ключи, отключи доступ по ssh и проблема решена. Однако, это не всегда удобно, да и данной статьи бы не было, если бы я все это сделал.
И для мониторинга такой активности было решено написать небольшой скрипт, который будет посылать уведомления со статистикой о неудачных и удачных попытках входа.
Что нам потребуется:
- Установить fail2ban
- Установить curl
- Создать telegram бота, получить его токен и chat_id (это идентификатор чата, куда нам будут приходить сообщения)
- Для начала установим fail2ban и curl
sudo apt update
sudo apt install fail2ban curl
Рис. 1 Команды для установки fail2ban и curl
Хочу отметить, что после установки Fail2ban не настроен по умолчанию для активной защиты. Однако, он уже включает в себя некоторые предустановленные конфигурации и фильтры, которые можно использовать. Если вы хотите подробнее узнать о его работе, то обратитесь к официальном сайте.
- Создадим пустой файл в каталоге
touch ~/usr/local/bin/telegram_notification.sh
Рис. 2 Команда для создания пустого файла
- Приступим к написанию самого скрипта
#!/bin/bash
# Замените на ваш токен и chat_id
TOKEN="123456789:ABCDEFGHIJKLMN_OPQRSTUVWXYZ123456"
CHAT_ID="987654321"
# Функция для отправки сообщения в Telegram
send_telegram_message() {
local message="$1"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID" \
-d "text=$message" \
-d "parse_mode=HTML"
}
# Переменная для отслеживания времени последнего уведомления о неудачных попытках и блокировках
last_failed_time=0
# Время (1 день) через которое следует посылать уведомления о неудачных попытках входа
track_time_range=86400
# Функция для проверки и отправки уведомлений о неудачных попытках и блокировках
check_failed_attempts() {
current_time=$(date +%s)
# Проверка, прошло ли больше суток с последнего уведомления
if (( current_time - last_failed_time >= track_time_range )); then
# Получаем информацию о неудачных попытках и блокировках за последние сутки
failed_attempts=$(grep "Failed password" /var/log/auth.log | wc -l)
bans=$(grep "Ban" /var/log/fail2ban.log | wc -l)
# Формируем сообщение
message=" Статистика за последние сутки:\n"
message+=" Неудачных попыток входа: $failed_attempts\n"
message+=" Заблокированных IP: $bans"
# Отправляем сообщение
send_telegram_message "$message"
last_failed_time=$current_time
fi
}
# Отслеживание логов аутентификации и Fail2Ban
tail -F /var/log/auth.log /var/log/fail2ban.log | while read line; do
# Проверка на успешные попытки входа
if echo "$line" | grep "Accepted password" &> /dev/null; then
send_telegram_message "✅ Успешный вход: $line"
fi
# Проверка на неудачные попытки входа
if echo "$line" | grep "Failed password" &> /dev/null; then
check_failed_attempts
fi
# Проверка на заблокированные IP-адреса
if echo "$line" | grep "Ban" &> /dev/null; then
check_failed_attempts
fi
done
Рис. 3 Скрипт, отвечающий за отправку статистики с уведомлениями
Данный скрипт, достаточно понятен. Стоит только заострить свое внимание на нескольких моментах, а именно на
tail -F /var/log/auth.log /var/log/fail2ban.log | while read line;
Рис. 4 Команда tail отвечающая за отображения последних строк текстового файла
Команда tail -F
отслеживает все изменения в log файлах и через pipe (|) передает их в цикл while, где изменения записываются в переменную line. В дальнейшем, цикл пробегается по условиям и формирует статистику неудачных попыток входа, а в случае удачной попытки, сообщение об этом немедленно отправляется в телеграмм.
Теперь осталось запустить данный скрипт. Для простоты, воспользуемся командой nohup. Эта команда позволяет запускать процессы, игнорируя сигнал HUP (hangup). Это полезно, когда вы хотите, чтобы процесс продолжал работать даже после выхода из системы или закрытия терминала. Однако, лучшей альтернативой будет использование systemd или supervisor, но эта статья не об этом.
Чтобы запустить команду с использованием nohup, просто добавьте nohup перед командой. Например:
nohup telegram_notification.sh &
Рис. 5 Команда nohup
Теперь проверим, работает ли наш скрипт
ps aux | telegram_notification*
Рис. 6 Отображения информации о запущенном процессе
В окне терминала, должен отобразиться запущенный процесс и его PID. Поздравляю, теперь вы будете получать уведомления о удачных и неудачных попытках входа по ssh на ваше сервер.
Заключение:
В заключение хочу отметить, что существуют и другие варианты подключения уведомлений. Например это можно сделать через jail и action в самом fail2ban c уже готовыми шаблонами (mail, telegram, slack и др.). Однако я предпочитаю использовать скрипты — это обеспечивает независимость от инструмента и позволяет реализовать любую логику: от мониторинга SSH-подключений до контроля системных служб, сетевого трафика и изменений в критически важных файлах.
Если вам понравилась эта статья, то вы знаете что нужно делать — подписывайтесь, ставьте лайки и делайте репосты. Это лучшая поддержка для автора. С вами был Дубовицкий Юрий, автор канала «Ваш код еще не готов, сэр».
А наш код уже готов. До связи!