Простой скрипт проверки доступности серверов или условий (Ping + SSH)
🛠 Простой Bash-скрипт для быстрой проверки доступности серверов (Ping + SSH)
Привет! 👋 Сегодня делюсь небольшой админской шпаргалкой. Никакого пафоса, дашбордов и сложных систем мониторинга — просто легкий bash-скрипт, который делает ровно одну вещь: быстро пробегается по списку IP-адресов и проверяет, живы ли они.
Вдруг кому-то из вас тоже пригодится в повседневной рутине, когда нужно за пару секунд проверить пачку хостов после перезагрузки или обновления сети.
⚙️ Как это работает:
Логика скрипта проста до безобразия:
- Вы создаете в папке со скриптом текстовый файл с названием
IPи закидываете туда нужные адреса (каждый с новой строки). Можно оставлять комментарии через#. - Скрипт читает файл и делает две проверки:
• ICMP (Ping) — проверяет, доступен ли вообще хост в сети (таймаут 1 секунда, чтобы не ждать вечность).
• SSH (Порт 22) — стучится на 22-й порт через/dev/tcp, чтобы понять, пустит ли сервер внутрь. - В консоль всё выводится красивым «светофором»: доступен — зеленым, недоступен — красным.
- Рядом автоматически создается
.logфайл с результатами (уже без цветовых кодов, чтобы логи читались чисто). В конце выводится краткая статистика.
💻 Код скрипта (check_hosts.sh)
#!/bin/bash
# Версия 0.0.1
# Настройка цветов для вывода
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # Без цвета
# ==============================================================================
# НАСТРОЙКИ
# ==============================================================================
INPUT_FILE="IP"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
LOG_FILE="$(pwd)/IP_Check_${TIMESTAMP}.log"
# Счетчики
TOTAL_CNT=0
PASS_ICMP=0
PASS_SSH=0
# ==============================================================================
# ПРОВЕРКИ
# ==============================================================================
if [ ! -f "$INPUT_FILE" ]; then
echo -e "${RED}- Ошибка: Файл '$INPUT_FILE' не найден!${NC}"
echo "Создайте файл '$INPUT_FILE' и запишите IP-адреса по одному на строку."
exit 1
fi
# Подсчет адресов (игнорируем пустые строки и комментарии)
TOTAL=$(grep -cE '^[^#[:space:]]' "$INPUT_FILE" 2>/dev/null || echo 0)
if [ "$TOTAL" -eq 0 ]; then
echo -e "${YELLOW}! Предупреждение: Файл '$INPUT_FILE' пуст или содержит только комментарии.${NC}"
exit 0
fi
# ==============================================================================
# ОСНОВНАЯ ЛОГИКА
# ==============================================================================
echo "=== Запуск проверки доступности хостов: $(date) ===" > "$LOG_FILE"
echo "Входной файл: $INPUT_FILE (Всего адресов: $TOTAL)" >> "$LOG_FILE"
echo "=================================================" >> "$LOG_FILE"
echo -e "\n================================================="
echo -e "ПРОВЕРКА ХОСТОВ ИЗ ФАЙЛА: $INPUT_FILE"
echo -e "================================================="
while IFS= read -r line || [[ -n "$line" ]]; do
# Очистка от пробелов и пропуск пустых строк/комментариев
IP=$(echo "$line" | tr -d '[:space:]')
[[ -z "$IP" || "$IP" == \#* ]] && continue
((TOTAL_CNT++))
ICMP_STATUS="нет"
ICMP_COLOR="${RED}недоступен (-)${NC}"
SSH_STATUS="нет"
SSH_COLOR="${RED}недоступен (-)${NC}"
# Проверка ICMP (1 пакет, таймаут 1 сек - оптимально для скорости)
if ping -c 1 -W 1 "$IP" &>/dev/null; then
ICMP_STATUS="да"
ICMP_COLOR="${GREEN}доступен (+)${NC} "
((PASS_ICMP++))
fi
# Проверка SSH (порт 22, таймаут 2 сек)
if timeout 2 bash -c "</dev/tcp/$IP/22" &>/dev/null 2>&1; then
SSH_STATUS="да"
SSH_COLOR="${GREEN}доступен (+)${NC}"
((PASS_SSH++))
fi
# Вывод в консоль с выравниванием (с помощью printf для IP)
echo -e "Хост: $(printf "%-15s" "$IP") | ICMP: $ICMP_COLOR | SSH (22): $SSH_COLOR"
# Запись в лог без цветовых ANSI-кодов
echo "Хост: $IP | ICMP: $ICMP_STATUS | SSH: $SSH_STATUS" >> "$LOG_FILE"
done < "$INPUT_FILE"
# ==============================================================================
# ВЫВОД ИТОГОВ
# ==============================================================================
echo -e "\n=================================================" | tee -a "$LOG_FILE"
echo -e "СУММАРНЫЙ ИТОГ ПРОВЕРКИ:" | tee -a "$LOG_FILE"
echo -e "=================================================" | tee -a "$LOG_FILE"
echo -e "Всего проверено хостов: ${TOTAL_CNT}" | tee -a "$LOG_FILE"
echo -e "Доступно по ICMP (+) : ${GREEN}${PASS_ICMP}${NC} / ${TOTAL_CNT}"
echo -e "Доступно по SSH (+) : ${GREEN}${PASS_SSH}${NC} / ${TOTAL_CNT}"
# Дописываем итоги в лог без цветов
echo "Доступно по ICMP (+): $PASS_ICMP / $TOTAL_CNT" >> "$LOG_FILE"
echo "Доступно по SSH (+): $PASS_SSH / $TOTAL_CNT" >> "$LOG_FILE"
echo -e "\nПолный лог сохранен в: ${GREEN}$LOG_FILE${NC}"
Не забудьте дать скрипту права на выполнение:chmod +x check_hosts.sh. Код открытый, так что легко можете переделать проверку 22 порта на любой другой нужный вам сервис. Удачного администрирования! 🐧💻
- misterleks от