网络连通性批量测试脚本
批量测试服务器网络连通性,支持Ping、TCP端口、HTTP检测,输出网络质量报告
详细内容
#!/bin/bash
# ==========================================
# 网络连通性批量测试脚本
# 用途:批量测试网络连通性,支持Ping、TCP端口、HTTP检测
# 使用方法:bash network_check.sh
# ==========================================
# 配置
PING_HOSTS="${PING_HOSTS:-8.8.8.8 114.114.114.114 www.baidu.com}"
TCP_TARGETS="${TCP_TARGETS:-www.baidu.com:80 www.baidu.com:443}"
HTTP_URLS="${HTTP_URLS:-https://www.baidu.com}"
PING_COUNT="${PING_COUNT:-4}"
TIMEOUT="${TIMEOUT:-5}"
echo "========== 网络连通性测试报告 =========="
echo "测试时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
# 1. Ping测试
echo "【1. Ping连通性测试】"
for host in $PING_HOSTS; do
echo " 测试: $host"
if command -v ping &> /dev/null; then
PING_RESULT=$(ping -c "$PING_COUNT" -W "$TIMEOUT" "$host" 2>&1)
if echo "$PING_RESULT" | grep -q "0 received\|100% packet loss"; then
echo " ❌ 无法连通"
else
LOSS=$(echo "$PING_RESULT" | grep "packet loss" | awk '{print $6}' | tr -d '%')
AVG_TIME=$(echo "$PING_RESULT" | grep "rtt min" | awk -F'/' '{print $5}')
echo " ✅ 连通正常,丢包率: ${LOSS}%,平均延迟: ${AVG_TIME}ms"
fi
else
echo " ⚠️ ping命令不可用"
fi
done
echo ""
# 2. TCP端口测试
echo "【2. TCP端口连通性测试】"
for target in $TCP_TARGETS; do
host=$(echo "$target" | cut -d: -f1)
port=$(echo "$target" | cut -d: -f2)
echo " 测试: $host:$port"
if command -v nc &> /dev/null; then
if nc -z -w "$TIMEOUT" "$host" "$port" 2>/dev/null; then
echo " ✅ 端口开放"
else
echo " ❌ 端口关闭或无法连接"
fi
elif command -v telnet &> /dev/null; then
if timeout "$TIMEOUT" bash -c "echo > /dev/tcp/$host/$port" 2>/dev/null; then
echo " ✅ 端口开放"
else
echo " ❌ 端口关闭或无法连接"
fi
else
echo " ⚠️ nc/telnet命令不可用"
fi
done
echo ""
# 3. HTTP/HTTPS测试
echo "【3. HTTP/HTTPS连通性测试】"
for url in $HTTP_URLS; do
echo " 测试: $url"
if command -v curl &> /dev/null; then
HTTP_RESULT=$(curl -s -o /dev/null -w "%{http_code} %{time_total} %{size_download}" --connect-timeout "$TIMEOUT" --max-time "$TIMEOUT" "$url" 2>/dev/null)
if [ -n "$HTTP_RESULT" ]; then
HTTP_CODE=$(echo "$HTTP_RESULT" | awk '{print $1}')
RESP_TIME=$(echo "$HTTP_RESULT" | awk '{print $2}')
DOWNLOAD_SIZE=$(echo "$HTTP_RESULT" | awk '{print $3}')
if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 400 ]; then
echo " ✅ 访问成功,状态码: $HTTP_CODE,响应时间: ${RESP_TIME}s,下载大小: ${DOWNLOAD_SIZE}字节"
else
echo " ⚠️ 访问异常,状态码: $HTTP_CODE"
fi
else
echo " ❌ 无法访问"
fi
else
echo " ⚠️ curl命令不可用"
fi
done
echo ""
# 4. DNS解析测试
echo "【4. DNS解析测试】"
DNS_SERVERS="${DNS_SERVERS:-8.8.8.8 114.114.114.114}"
TEST_DOMAIN="${TEST_DOMAIN:-www.baidu.com}"
for dns in $DNS_SERVERS; do
echo " DNS服务器: $dns"
if command -v nslookup &> /dev/null; then
DNS_RESULT=$(nslookup "$TEST_DOMAIN" "$dns" 2>&1)
if echo "$DNS_RESULT" | grep -q "Address:"; then
IP=$(echo "$DNS_RESULT" | grep "Address:" | tail -1 | awk '{print $2}')
echo " ✅ 解析成功,IP: $IP"
else
echo " ❌ 解析失败"
fi
elif command -v dig &> /dev/null; then
DNS_RESULT=$(dig @"$dns" "$TEST_DOMAIN" +short 2>/dev/null)
if [ -n "$DNS_RESULT" ]; then
echo " ✅ 解析成功,IP: $DNS_RESULT"
else
echo " ❌ 解析失败"
fi
else
echo " ⚠️ nslookup/dig命令不可用"
fi
done
echo ""
# 5. 网络质量评估
echo "【5. 网络质量评估】"
echo " 本地IP信息:"
if command -v ip &> /dev/null; then
ip addr show | grep "inet " | grep -v "127.0.0.1" | awk '{print " " $2 " (" $NF ")"}'
elif command -v ifconfig &> /dev/null; then
ifconfig | grep "inet " | grep -v "127.0.0.1" | awk '{print " " $2 " (" $NF ")"}'
fi
echo " 网关信息:"
if command -v ip &> /dev/null; then
ip route | grep default | awk '{print " 网关: " $3 ", 接口: " $5}'
fi
echo " 公网IP:"
if command -v curl &> /dev/null; then
PUBLIC_IP=$(curl -s --connect-timeout 3 ifconfig.me 2>/dev/null)
[ -n "$PUBLIC_IP" ] && echo " $PUBLIC_IP" || echo " 无法获取"
fi
echo ""
echo "========== 测试完成 =========="
echo "提示: 可将此脚本加入crontab定时执行,监控网络稳定性"
适配环境
适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+
依赖环境:bash 4.0+
参数说明
[{"name": "PING_HOSTS", "label": "Ping\u6d4b\u8bd5\u4e3b\u673a(\u7a7a\u683c\u5206\u9694)", "default": "8.8.8.8 114.114.114.114"}, {"name": "TCP_TARGETS", "label": "TCP\u7aef\u53e3\u6d4b\u8bd5(\u4e3b\u673a:\u7aef\u53e3)", "default": "www.baidu.com:80"}, {"name": "HTTP_URLS", "label": "HTTP\u6d4b\u8bd5URL", "default": "https://www.baidu.com"}, {"name": "PING_COUNT", "label": "Ping\u6b21\u6570", "default": "4"}]