#!/usr/bin/env bash # ============================================================================ # MAX PingMon — 多目标实时 Ping 监视器 # 原创脚本,受 prettyping (denilsonsa/prettyping) 的美化输出理念启发 # 但做成多目标并发实时监控,适合测网络质量抖动 # # 风险等级: 🟢 只读 — 不修改任何系统设置 # 用法: bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-pingmon.sh) # 指定目标: bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-pingmon.sh) 8.8.8.8 1.1.1.1 # ============================================================================ R='\033[1;31m' G='\033[1;32m' Y='\033[1;33m' B='\033[1;34m' C='\033[1;36m' M='\033[1;35m' W='\033[1;37m' N='\033[0m' GR='\033[90m' cleanup() { echo -e "\n\n${GR}已退出${N}"; exit 0; } trap cleanup INT TERM if [ $# -gt 0 ]; then TARGETS=("$@") else TARGETS=("8.8.8.8" "1.1.1.1" "223.5.5.5" "114.114.114.114") fi echo -e "${B}┌─────────────────────────────────────────────┐${N}" echo -e "${B}│${N} ${G}MAX 实时 Ping 监视器${N} ${GR}(Ctrl+C 退出)${N}" echo -e "${B}└─────────────────────────────────────────────┘${N}" echo -e " ${GR}目标: ${TARGETS[*]}${N}" echo -e " ${GR}每轮 3 次 ping,间歇 2 秒${N}" echo round=0 while true; do round=$((round + 1)) echo -e "${C}[第 $round 轮] $(date '+%H:%M:%S')${N}" for target in "${TARGETS[@]}"; do result=$(ping -c 3 -W 1 "$target" 2>/dev/null) avg=$(echo "$result" | tail -1 | awk -F'/' '{print $5}' 2>/dev/null) loss=$(echo "$result" | grep -oP '\d+(?=% packet loss)' 2>/dev/null) [ -z "$loss" ] && loss=100 [ -z "$avg" ] && avg="N/A" # 根据延迟着色 status="" if [ "$loss" = "100" ] || [ "$loss" = "?" ]; then echo -e " ${R}✘ $target 超时 (丢包 100%)${N}" else if [ "$loss" -gt 10 ]; then echo -e " ${Y}⚠ $target avg=${avg}ms 丢包=${loss}%${N}" elif [ "$(echo "$avg" | cut -d. -f1 2>/dev/null)" -lt 50 ] 2>/dev/null; then echo -e " ${G}✔ $target avg=${avg}ms 丢包=${loss}%${N}" elif [ "$(echo "$avg" | cut -d. -f1 2>/dev/null)" -lt 200 ] 2>/dev/null; then echo -e " ${Y}~ $target avg=${avg}ms 丢包=${loss}%${N}" else echo -e " ${R}✘ $target avg=${avg}ms 丢包=${loss}%${N}" fi fi done sleep 2 echo done