#!/bin/bash
# Скрипт HTTP пингования
# Проверяет доступность хоста через HTTP/HTTPS
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Параметры по умолчанию
HOST=""
PROTOCOL="http"
PORT=80
TIMEOUT=5
COUNT=4
VERBOSE=false
FOLLOW_REDIRECTS=true
# Функция для вывода справки
show_help() {
echo "Использование: $0 [OPTIONS] HOST"
echo ""
echo "Опции:"
echo " -p, --port PORT Порт для проверки (по умолчанию: 80)"
echo " -s, --https Использовать HTTPS вместо HTTP"
echo " -t, --timeout SEC Таймаут в секундах (по умолчанию: 5)"
echo " -c, --count NUM Количество проверок (по умолчанию: 4)"
echo " -v, --verbose Подробный вывод"
echo " -n, --no-redirect Не следовать редиректам"
echo " -h, --help Показать эту справку"
echo ""
echo "Примеры:"
echo " $0 example.com"
echo " $0 -s -p 443 example.com"
echo " $0 -t 10 -c 10 example.com"
}
# Парсинг аргументов командной строки
while [[ $# -gt 0 ]]; do
case $1 in
-p|--port)
PORT="$2"
shift 2
;;
-s|--https)
PROTOCOL="https"
PORT=443
shift
;;
-t|--timeout)
TIMEOUT="$2"
shift 2
;;
-c|--count)
COUNT="$2"
shift 2
;;
-v|--verbose)
VERBOSE=true
shift
;;
-n|--no-redirect)
FOLLOW_REDIRECTS=false
shift
;;
-h|--help)
show_help
exit 0
;;
-*)
echo "Неизвестная опция: $1"
show_help
exit 1
;;
*)
HOST="$1"
shift
;;
esac
done
# Проверка обязательного параметра HOST
if [[ -z "$HOST" ]]; then
echo "Ошибка: необходимо указать хост"
show_help
exit 1
fi
# Проверка наличия curl
if ! command -v curl &> /dev/null; then
echo "Ошибка: curl не установлен. Установите curl для работы скрипта."
exit 1
fi
# Функция для проверки доступности хоста
check_host() {
local url="$PROTOCOL://$HOST:$PORT"
local curl_cmd=("curl" "--silent" "--max-time" "$TIMEOUT" "--output" "/dev/null" "--write-out" "%{http_code}")
if [[ "$FOLLOW_REDIRECTS" == true ]]; then
curl_cmd+=("--location")
else
curl_cmd+=("--no-location")
fi
if [[ "$VERBOSE" == true ]]; then
curl_cmd+=("--verbose")
fi
curl_cmd+=("$url")
local response_code
response_code=$("${curl_cmd[@]}" 2>/dev/null)
local exit_code=$?
if [[ $exit_code -eq 0 ]]; then
if [[ $response_code =~ ^[23] ]]; then
echo -e "${GREEN}УСПЕХ${NC} - HTTP код: $response_code"
return 0
else
echo -e "${YELLOW}ЧАСТИЧНО${NC} - Хост отвечает, но HTTP код: $response_CODE"
return 1
fi
else
echo -e "${RED}ОШИБКА${NC} - Хост не отвечает (код ошибки: $exit_code)"
return 2
fi
}
# Основная функция пингования
http_ping() {
echo "HTTP пинг $HOST [$PROTOCOL, порт: $PORT, таймаут: ${TIMEOUT}с]"
echo "--------------------------------------------------"
local success_count=0
local total_count=0
for ((i=1; i<=COUNT; i++)); do
echo -n "Попытка $i: "
if check_host; then
((success_count++))
fi
((total_count++))
# Пауза между запросами, кроме последнего
if [[ $i -lt $COUNT ]]; then
sleep 1
fi
done
echo "--------------------------------------------------"
echo "Статистика:"
echo "Успешных: $success_count/$total_count"
if [[ $success_count -eq $total_count ]]; then
echo -e "${GREEN}Хост полностью доступен${NC}"
return 0
elif [[ $success_count -gt 0 ]]; then
echo -e "${YELLOW}Хост частично доступен${NC}"
return 1
else
echo -e "${RED}Хост недоступен${NC}"
return 2
fi
}
# Запуск пингования
http_ping
exit $?