Код: Выделить всё
#!/bin/bash
# ============================================================
# SSH MONITOR - ИНТЕРАКТИВНАЯ УСТАНОВКА
# Версия: 4.0
# ============================================================
if [[ $EUID -ne 0 ]]; then
echo "❌ Ошибка: Запустите от root (sudo)"
exit 1
fi
# ==================== ФУНКЦИИ ДЛЯ КРАСИВОГО ВЫВОДА ====================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
print_header() {
echo ""
echo -e "${BLUE}========================================${NC}"
echo -e "${CYAN} $1${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
}
print_success() {
echo -e "${GREEN}✅ $1${NC}"
}
print_error() {
echo -e "${RED}❌ $1${NC}"
}
print_info() {
echo -e "${YELLOW}ℹ️ $1${NC}"
}
print_question() {
echo -e "${CYAN}❓ $1${NC}"
}
# ==================== ФУНКЦИЯ ВВОДА С ПРОВЕРКОЙ ====================
get_input() {
local prompt="$1"
local default="$2"
local input=""
if [[ -n "$default" ]]; then
read -p "$prompt [$default]: " input
input="${input:-$default}"
else
read -p "$prompt: " input
fi
echo "$input"
}
# ==================== ФУНКЦИЯ ПРОВЕРКИ EMAIL ====================
validate_email() {
local email="$1"
if [[ -z "$email" ]]; then
return 1
fi
if [[ "$email" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ ]]; then
return 0
else
return 1
fi
}
# ==================== ФУНКЦИЯ ПРОВЕРКИ IP ====================
validate_ip() {
local ip="$1"
if [[ -z "$ip" ]]; then
return 1
fi
# Простая проверка IP
if [[ "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
return 0
elif [[ "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}$ ]]; then
return 0
else
return 1
fi
}
# ==================== ЗАГОЛОВОК ====================
clear
print_header "🔐 SSH MONITOR - ИНТЕРАКТИВНАЯ УСТАНОВКА"
echo -e "${YELLOW}Этот скрипт установит систему мониторинга SSH подключений.${NC}"
echo -e "${YELLOW}Вы будете получать уведомления на email при подозрительных подключениях.${NC}"
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
# ==================== 1. НАСТРОЙКИ ПОЧТЫ ====================
print_header "📧 НАСТРОЙКИ ПОЧТЫ"
echo -e "${YELLOW}Укажите email, куда будут приходить уведомления${NC}"
echo ""
while true; do
EMAIL_TO=$(get_input "📧 Ваш email" "admin@padonak.su")
if validate_email "$EMAIL_TO"; then
print_success "Email принят: $EMAIL_TO"
break
else
print_error "Неверный формат email. Попробуйте снова."
fi
done
echo ""
# ==================== 2. РАЗРЕШЕННЫЕ IP ====================
print_header "🛡️ РАЗРЕШЕННЫЕ IP АДРЕСА"
echo -e "${YELLOW}Укажите IP адреса, с которых разрешены подключения.${NC}"
echo -e "${YELLOW}Можно указать отдельные IP или подсети (например, 192.168.1.0/24).${NC}"
echo -e "${YELLOW}Если ничего не ввести, будет добавлен текущий IP сервера.${NC}"
echo ""
# Определяем текущий IP сервера
CURRENT_IP=$(hostname -I | awk '{print $1}')
if [[ -z "$CURRENT_IP" ]]; then
CURRENT_IP="127.0.0.1"
fi
ALLOWED_IPS=()
IP_COUNT=0
while true; do
IP_COUNT=$((IP_COUNT + 1))
echo -e "${CYAN}IP #$IP_COUNT:${NC}"
# Если первый раз, предлагаем текущий IP
if [[ $IP_COUNT -eq 1 ]]; then
DEFAULT_IP="$CURRENT_IP"
echo -e "${YELLOW}💡 Рекомендуется добавить ваш текущий IP: $CURRENT_IP${NC}"
else
DEFAULT_IP=""
fi
read -p "Введите IP (или нажмите Enter для завершения): " ip_input
if [[ -z "$ip_input" ]]; then
if [[ $IP_COUNT -eq 1 ]]; then
print_info "Добавляю текущий IP: $CURRENT_IP"
ALLOWED_IPS+=("$CURRENT_IP")
else
break
fi
else
if validate_ip "$ip_input"; then
ALLOWED_IPS+=("$ip_input")
print_success "Добавлен IP: $ip_input"
else
print_error "Неверный формат IP. Используйте: 192.168.1.1 или 192.168.1.0/24"
IP_COUNT=$((IP_COUNT - 1))
fi
fi
echo ""
done
echo ""
print_info "Добавлено разрешенных IP: ${#ALLOWED_IPS[@]}"
for ip in "${ALLOWED_IPS[@]}"; do
echo -e " ${GREEN}•${NC} $ip"
done
# ==================== 3. ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ ====================
print_header "⚙️ ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ"
echo ""
# Интервал проверки
echo -e "${CYAN}Интервал проверки (секунды):${NC}"
echo -e "${YELLOW}Как часто проверять новые подключения.${NC}"
echo -e "${YELLOW}Рекомендуется: 5-10 секунд${NC}"
CHECK_INTERVAL=$(get_input "⏱️ Интервал" "5")
print_success "Интервал: $CHECK_INTERVAL секунд"
echo ""
# Автоблокировка
echo -e "${CYAN}Автоматическая блокировка подозрительных IP:${NC}"
echo -e "${YELLOW}Включить автоматическую блокировку через iptables?${NC}"
echo " 1) Да - блокировать автоматически"
echo " 2) Нет - только уведомления (рекомендуется)"
read -p "Выберите [1-2]: " auto_block_choice
case "$auto_block_choice" in
1)
AUTO_BLOCK="yes"
print_success "Автоблокировка включена"
;;
*)
AUTO_BLOCK="no"
print_success "Автоблокировка выключена (только уведомления)"
;;
esac
echo ""
# Уведомления о разрешенных
echo -e "${CYAN}Уведомления о разрешенных подключениях:${NC}"
echo -e "${YELLOW}Отправлять уведомления даже с разрешенных IP?${NC}"
echo " 1) Только подозрительные (рекомендуется)"
echo " 2) Все подключения"
read -p "Выберите [1-2]: " notify_choice
case "$notify_choice" in
2)
NOTIFY_ONLY_SUSPICIOUS="no"
print_success "Уведомления будут приходить на все подключения"
;;
*)
NOTIFY_ONLY_SUSPICIOUS="yes"
print_success "Уведомления только о подозрительных"
;;
esac
echo ""
# ==================== 4. ПОДТВЕРЖДЕНИЕ ====================
print_header "📋 ПРОВЕРЬТЕ НАСТРОЙКИ"
echo -e "${CYAN}Почта:${NC} $EMAIL_TO"
echo -e "${CYAN}Разрешенные IP:${NC}"
for ip in "${ALLOWED_IPS[@]}"; do
echo -e " • $ip"
done
echo -e "${CYAN}Интервал проверки:${NC} $CHECK_INTERVAL секунд"
echo -e "${CYAN}Автоблокировка:${NC} $AUTO_BLOCK"
echo -e "${CYAN}Уведомления:${NC} $([ "$NOTIFY_ONLY_SUSPICIOUS" == "yes" ] && echo "Только подозрительные" || echo "Все подключения")"
echo ""
read -p "Продолжить установку? (y/n): " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
print_error "Установка отменена"
exit 1
fi
# ==================== 5. СОЗДАНИЕ СКРИПТА ====================
print_header "📝 СОЗДАНИЕ СКРИПТА"
# Формируем список IP для вставки в скрипт
ALLOWED_IPS_STR=""
for ip in "${ALLOWED_IPS[@]}"; do
ALLOWED_IPS_STR+=" \"$ip\"\n"
done
# Создаём скрипт с подставленными настройками
cat > /usr/local/bin/ssh-monitor.sh << EOF
#!/bin/bash
# ============================================================
# SSH MONITOR - Автоматически создан $(date)
# ============================================================
#
# НАСТРОЙКИ (можно изменить):
# ============================================================
EMAIL_TO="$EMAIL_TO"
EMAIL_FROM="ssh-alert@\$(hostname -f)"
ALLOWED_IPS=(
$ALLOWED_IPS_STR
)
CHECK_INTERVAL="$CHECK_INTERVAL"
AUTO_BLOCK="$AUTO_BLOCK"
NOTIFY_ONLY_SUSPICIOUS="$NOTIFY_ONLY_SUSPICIOUS"
# ============================================================
# ДАЛЬШЕ НИЧЕГО НЕ МЕНЯЙТЕ
# ============================================================
LOG_FILE="/var/log/ssh-monitor.log"
STATE_DIR="/var/lib/ssh-monitor"
STATE_FILE="\$STATE_DIR/last_state"
PID_FILE="/var/run/ssh-monitor.pid"
log_message() {
echo "[\$(date '+%Y-%m-%d %H:%M:%S')] \$1" | tee -a "\$LOG_FILE"
}
send_email() {
local subject="\$1"
local body="\$2"
local email_content="From: \$EMAIL_FROM
To: \$EMAIL_TO
Subject: \$subject
Content-Type: text/plain; charset=UTF-8
\$body
---
Сервер: \$(hostname -f)
IP сервера: \$(hostname -I | awk '{print \$1}')
Время: \$(date '+%Y-%m-%d %H:%M:%S')
"
if command -v sendmail &> /dev/null; then
echo "\$email_content" | sendmail -t && return 0
fi
if command -v mail &> /dev/null; then
echo "\$body" | mail -s "\$subject" -a "From: \$EMAIL_FROM" "\$EMAIL_TO" && return 0
fi
log_message "❌ НЕТ СПОСОБОВ ОТПРАВКИ ПОЧТЫ!"
log_message " Установите: apt install mailutils"
return 1
}
is_ip_allowed() {
local ip="\$1"
if [[ -z "\$ip" ]] || [[ "\$ip" == "unknown" ]]; then
return 1
fi
for allowed in "\${ALLOWED_IPS[@]}"; do
if [[ "\$ip" == "\$allowed" ]]; then
return 0
fi
if [[ "\$allowed" == *"/24" ]]; then
local ip_prefix=\$(echo "\$ip" | cut -d'.' -f1-3)
local net_prefix=\$(echo "\$allowed" | cut -d'/' -f1 | cut -d'.' -f1-3)
if [[ "\$ip_prefix" == "\$net_prefix" ]]; then
return 0
fi
fi
if [[ "\$allowed" == *"/16" ]]; then
local ip_prefix=\$(echo "\$ip" | cut -d'.' -f1-2)
local net_prefix=\$(echo "\$allowed" | cut -d'/' -f1 | cut -d'.' -f1-2)
if [[ "\$ip_prefix" == "\$net_prefix" ]]; then
return 0
fi
fi
if [[ "\$allowed" == *"/8" ]]; then
local ip_prefix=\$(echo "\$ip" | cut -d'.' -f1)
local net_prefix=\$(echo "\$allowed" | cut -d'/' -f1 | cut -d'.' -f1)
if [[ "\$ip_prefix" == "\$net_prefix" ]]; then
return 0
fi
fi
done
return 1
}
get_ip_for_pid() {
local pid="\$1"
if command -v ss &> /dev/null; then
local ip=\$(ss -tnp 2>/dev/null | grep "pid=\$pid" | head -1 | awk '{print \$5}' | cut -d':' -f1)
if [[ -n "\$ip" ]] && [[ "\$ip" != "0.0.0.0" ]] && [[ "\$ip" != "::" ]] && [[ "\$ip" != "*" ]]; then
echo "\$ip"
return 0
fi
fi
if command -v netstat &> /dev/null; then
local ip=\$(netstat -tnp 2>/dev/null | grep "\$pid/sshd" | head -1 | awk '{print \$5}' | cut -d':' -f1)
if [[ -n "\$ip" ]] && [[ "\$ip" != "0.0.0.0" ]] && [[ "\$ip" != "::" ]] && [[ "\$ip" != "*" ]]; then
echo "\$ip"
return 0
fi
fi
local tty=\$(ps -o tty= -p "\$pid" 2>/dev/null | tr -d ' ')
if [[ -n "\$tty" ]] && [[ "\$tty" != "?" ]]; then
local ip=\$(who -u 2>/dev/null | grep "\$tty" | awk '{print \$NF}' | sed 's/[()]//g')
if [[ -n "\$ip" ]] && [[ "\$ip" != "0.0.0.0" ]] && [[ "\$ip" != "::" ]] && [[ "\$ip" != "*" ]]; then
echo "\$ip"
return 0
fi
fi
echo "unknown"
}
get_ssh_sessions() {
ps aux | grep -E 'sshd-session:.*@|sshd:.*@' | grep -v grep | grep -v "listener" | grep -v "accepted" | awk '{print \$2}'
}
block_ip() {
local ip="\$1"
if [[ "\$AUTO_BLOCK" != "yes" ]]; then
return 0
fi
log_message "🔒 БЛОКИРУЮ IP: \$ip"
if command -v iptables &> /dev/null; then
iptables -I INPUT -s "\$ip" -j DROP 2>/dev/null
if [[ \$? -eq 0 ]]; then
log_message "✅ IP \$ip заблокирован через iptables"
return 0
fi
fi
if command -v ufw &> /dev/null; then
ufw deny from "\$ip" 2>/dev/null
if [[ \$? -eq 0 ]]; then
log_message "✅ IP \$ip заблокирован через ufw"
return 0
fi
fi
log_message "❌ НЕ УДАЛОСЬ ЗАБЛОКИРОВАТЬ IP \$ip"
return 1
}
process_session() {
local pid="\$1"
local user=\$(ps -o user= -p "\$pid" 2>/dev/null | tr -d ' ')
local client_ip=\$(get_ip_for_pid "\$pid")
local start_time=\$(ps -o lstart= -p "\$pid" 2>/dev/null | tr -d ' ')
log_message "🔍 НОВАЯ СЕССИЯ: PID=\$pid, USER=\$user, IP=\$client_ip"
if [[ -z "\$client_ip" ]] || [[ "\$client_ip" == "unknown" ]]; then
log_message "⚠️ НЕ УДАЛОСЬ ОПРЕДЕЛИТЬ IP для PID \$pid"
return 1
fi
local subject=""
local body=""
local send=false
if is_ip_allowed "\$client_ip"; then
log_message "✅ РАЗРЕШЕННЫЙ IP: \$client_ip"
if [[ "\$NOTIFY_ONLY_SUSPICIOUS" == "no" ]]; then
subject="✅ Разрешенное SSH подключение от \$client_ip"
body="✅ РАЗРЕШЕННОЕ SSH ПОДКЛЮЧЕНИЕ
========================================
Пользователь: \$user
IP адрес: \$client_ip
Время подключения: \$start_time
Сервер: \$(hostname -f)
========================================"
send=true
fi
else
log_message "🚨 ПОДОЗРИТЕЛЬНЫЙ IP: \$client_ip"
subject="🚨 ПОДОЗРИТЕЛЬНОЕ SSH подключение с IP \$client_ip!"
body="⚠️ ПОДОЗРИТЕЛЬНОЕ SSH ПОДКЛЮЧЕНИЕ
========================================
СТАТУС: ❌ НЕ РАЗРЕШЕН!
Пользователь: \$user
IP адрес: \$client_ip
Время подключения: \$start_time
Сервер: \$(hostname -f)
========================================
🔴 ВНИМАНИЕ! Подключение с НЕИЗВЕСТНОГО IP!
Рекомендации:
1. Проверьте логи: sudo tail -f /var/log/auth.log
2. Заблокируйте IP: sudo iptables -A INPUT -s \$client_ip -j DROP
3. Проверьте активные сессии: who -u
Текущие сессии:
\$(who -u 2>/dev/null || echo "Недоступно")
========================================"
send=true
if [[ "\$AUTO_BLOCK" == "yes" ]]; then
block_ip "\$client_ip"
fi
fi
if [[ "\$send" == true ]]; then
send_email "\$subject" "\$body"
fi
}
show_status() {
echo "========================================="
echo "📊 SSH MONITOR - СТАТУС"
echo "========================================="
echo ""
echo "📧 Уведомления на: \$EMAIL_TO"
echo "🛡️ Разрешенные IP:"
for ip in "\${ALLOWED_IPS[@]}"; do
echo " - \$ip"
done
echo ""
echo "🔄 Интервал проверки: \$CHECK_INTERVAL секунд"
echo "🔒 Автоблокировка: \$AUTO_BLOCK"
echo ""
echo "📂 Лог-файл: \$LOG_FILE"
echo ""
echo "👥 Активные сессии:"
who -u 2>/dev/null || echo " Нет активных сессий"
echo ""
echo "📝 Последние 5 записей лога:"
tail -5 "\$LOG_FILE" 2>/dev/null || echo " Лог пуст"
echo "========================================="
}
test_email() {
echo "📧 Отправка тестового письма на \$EMAIL_TO..."
local subject="🧪 Тестовое письмо от SSH Monitor"
local body="ТЕСТОВОЕ ПИСЬМО
========================================
Это тестовое письмо от SSH Monitor.
Если вы видите это письмо, значит система работает корректно.
Сервер: \$(hostname -f)
IP: \$(hostname -I | awk '{print \$1}')
Время: \$(date '+%Y-%m-%d %H:%M:%S')
========================================"
if send_email "\$subject" "\$body"; then
echo "✅ Тестовое письмо отправлено!"
else
echo "❌ Не удалось отправить тестовое письмо"
echo " Проверьте настройки почты"
fi
}
case "\$1" in
--status|status)
show_status
exit 0
;;
--test|test)
test_email
exit 0
;;
--help|help|-h)
echo "========================================="
echo "SSH MONITOR - СПРАВКА"
echo "========================================="
echo ""
echo "Использование: \$0 [ОПЦИЯ]"
echo ""
echo "Опции:"
echo " --status, status - Показать статус и статистику"
echo " --test, test - Отправить тестовое письмо"
echo " --help, help, -h - Показать эту справку"
echo ""
echo "Без опций запускается в режиме мониторинга"
echo "========================================="
exit 0
;;
esac
mkdir -p "\$(dirname "\$LOG_FILE")" "\$STATE_DIR"
touch "\$LOG_FILE"
if [[ -f "\$PID_FILE" ]]; then
local old_pid=\$(cat "\$PID_FILE" 2>/dev/null)
if kill -0 "\$old_pid" 2>/dev/null; then
echo "❌ Скрипт уже запущен (PID: \$old_pid)"
echo " Если это не так, удалите: rm -f \$PID_FILE"
exit 1
fi
fi
echo \$\$ > "\$PID_FILE"
log_message "========================================="
log_message "🚀 ЗАПУСК SSH MONITOR"
log_message "📧 Уведомления на: \$EMAIL_TO"
log_message "🛡️ Разрешенные IP: \${ALLOWED_IPS[*]}"
log_message "🔄 Интервал проверки: \$CHECK_INTERVAL сек"
log_message "🔒 Автоблокировка: \$AUTO_BLOCK"
log_message "📢 Уведомлять только о подозрительных: \$NOTIFY_ONLY_SUSPICIOUS"
log_message "========================================="
EXISTING_SESSIONS=\$(get_ssh_sessions)
if [[ -n "\$EXISTING_SESSIONS" ]]; then
log_message "Найдено существующих сессий: \$(echo "\$EXISTING_SESSIONS" | wc -w)"
else
log_message "Активных сессий не найдено"
fi
echo "\$EXISTING_SESSIONS" > "\$STATE_FILE"
log_message "✅ Инициализация завершена"
while true; do
local current_sessions=\$(get_ssh_sessions)
if [[ -n "\$current_sessions" ]]; then
local previous_sessions=\$(cat "\$STATE_FILE" 2>/dev/null || echo "")
for pid in \$current_sessions; do
if ! echo "\$previous_sessions" | grep -q "^\$pid\$"; then
process_session "\$pid"
fi
done
echo "\$current_sessions" > "\$STATE_FILE"
else
echo "" > "\$STATE_FILE" 2>/dev/null
fi
sleep "\$CHECK_INTERVAL"
done
EOF
chmod +x /usr/local/bin/ssh-monitor.sh
print_success "Скрипт создан: /usr/local/bin/ssh-monitor.sh"
# ==================== 6. СОЗДАНИЕ СЕРВИСА ====================
print_header "📝 СОЗДАНИЕ СИСТЕМНОГО СЕРВИСА"
cat > /etc/systemd/system/ssh-monitor.service << 'EOF'
[Unit]
Description=SSH Monitor
After=network.target ssh.service
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ssh-monitor.sh
Restart=always
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable ssh-monitor
systemctl restart ssh-monitor
print_success "Сервис создан и запущен"
# ==================== 7. ТЕСТИРОВАНИЕ ====================
print_header "🧪 ТЕСТИРОВАНИЕ"
echo -e "${YELLOW}Проверяем работу сервиса...${NC}"
sleep 2
if systemctl is-active --quiet ssh-monitor; then
print_success "Сервис работает!"
else
print_error "Сервис не запущен"
systemctl status ssh-monitor --no-pager
fi
echo ""
print_question "Отправить тестовое письмо на $EMAIL_TO?"
read -p "(y/n): " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
/usr/local/bin/ssh-monitor.sh --test
fi
# ==================== 8. ИНФОРМАЦИЯ ====================
print_header "✅ УСТАНОВКА ЗАВЕРШЕНА!"
echo -e "${CYAN}📋 ВАШИ НАСТРОЙКИ:${NC}"
echo -e " 📧 Email: ${GREEN}$EMAIL_TO${NC}"
echo -e " 🛡️ Разрешенные IP:"
for ip in "${ALLOWED_IPS[@]}"; do
echo -e " • ${GREEN}$ip${NC}"
done
echo -e " ⏱️ Интервал: ${GREEN}$CHECK_INTERVAL${NC} секунд"
echo -e " 🔒 Автоблокировка: ${GREEN}$AUTO_BLOCK${NC}"
echo ""
echo -e "${CYAN}📝 КОМАНДЫ УПРАВЛЕНИЯ:${NC}"
echo -e " ${BLUE}systemctl status ssh-monitor${NC} - Статус"
echo -e " ${BLUE}systemctl restart ssh-monitor${NC} - Перезапуск"
echo -e " ${BLUE}systemctl stop ssh-monitor${NC} - Остановка"
echo -e " ${BLUE}journalctl -u ssh-monitor -f${NC} - Логи (системные)"
echo -e " ${BLUE}tail -f /var/log/ssh-monitor.log${NC} - Логи"
echo ""
echo -e "${CYAN}📧 ДОПОЛНИТЕЛЬНО:${NC}"
echo -e " ${BLUE}/usr/local/bin/ssh-monitor.sh --test${NC} - Тестовое письмо"
echo -e " ${BLUE}/usr/local/bin/ssh-monitor.sh --status${NC} - Статистика"
echo ""
echo -e "${CYAN}🔧 ИЗМЕНЕНИЕ НАСТРОЕК:${NC}"
echo -e " ${BLUE}nano /usr/local/bin/ssh-monitor.sh${NC}"
echo -e " (измените первые 15 строк и перезапустите сервис)"
echo ""
print_success "SSH Monitor успешно установлен!"
echo -e "${GREEN}Теперь вы будете получать уведомления о подозрительных SSH подключениях!${NC}"
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
exit 0
КАК ИСПОЛЬЗОВАТЬ
# 1. Сохраните скрипт
Код: Выделить всё
vim install-ssh-monitor.sh# 3. Сделайте исполняемым
Код: Выделить всё
chmod +x install-ssh-monitor.shКод: Выделить всё
./install-ssh-monitor.shЧТО БУДЕТ ВО ВРЕМЯ УСТАНОВКИ:
Запросит email для уведомлений (с проверкой формата)
Запросит разрешенные IP (можно добавить несколько)
Запросит интервал проверки (по умолчанию 5 секунд)
Спросит про автоблокировку (Да/Нет)
Спросит про уведомления (только подозрительные или все)
Покажет все настройки и запросит подтверждение
Установит скрипт и сервис
Отправит тестовое письмо (по желанию)
Покажет команды для управления
