本文目录导读:

- 方法一:Ping 外网地址(最基础)
- 方法二:检测无线接口状态(更准确)
- 方法三:综合检测(网络质量 & 速度)
- 方法四:针对 macOS 的特殊方法
- 进阶:使用
curl或wget模拟 HTTP 请求 - 推荐的最佳实践组合
要检测无线网络是否正常,脚本通常需要从两个层面进行判断:网络连通性(是否能访问外网)和 网络质量(延迟、丢包率)。
以下提供几种适用于常见操作系统(Windows、Linux/macOS)的脚本方法,从简单到复杂。
Ping 外网地址(最基础)
通过 ping 一个稳定的公共 DNS(如 114.114.114.114 或 8.8.8.8)来判断网络是否通。
Bash 脚本 (Linux/macOS)
#!/bin/bash
TARGET="114.114.114.114"
COUNT=3
# -c: 发送次数, -W: 超时时间
if ping -c $COUNT -W 2 $TARGET > /dev/null 2>&1; then
echo "网络正常: 可以访问 $TARGET"
else
echo "网络异常: 无法访问 $TARGET"
fi
批处理脚本 (Windows CMD)
@echo off
set TARGET=114.114.114.114
ping -n 3 %TARGET% | find "TTL" > nul
if %errorlevel%==0 (
echo 网络正常
) else (
echo 网络异常
)
PowerShell 脚本 (Windows)
$target = "114.114.114.114"
if (Test-Connection -ComputerName $target -Count 2 -Quiet) {
Write-Host "网络正常" -ForegroundColor Green
} else {
Write-Host "网络异常" -ForegroundColor Red
}
缺点:只能判断是否能路由到该 IP,但无法判断无线信号强度或 DHCP 是否正确。
检测无线接口状态(更准确)
先确保无线网卡已连接(有 IP),再测试连通性。
Bash 脚本 (Linux)
#!/bin/bash
# 1. 检查无线接口是否关联到热点
WIFI_INTERFACE=$(iw dev | awk '$1=="Interface"{print $2}')
SSID=$(iw dev $WIFI_INTERFACE link | grep -i "SSID" | awk '{print $2}')
if [ -z "$SSID" ]; then
echo "无线未连接: 未关联到任何 SSID"
exit 1
fi
# 2. 检查是否拿到 IP(DHCP 状态)
IP=$(ip -4 addr show $WIFI_INTERFACE | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
if [ -z "$IP" ]; then
echo "无线已连接但 DHCP 失败: 没有 IP 地址"
exit 1
fi
# 3. 测试网关连通性(比直接 ping 外网更优先)
GATEWAY=$(ip route | grep default | grep $WIFI_INTERFACE | awk '{print $3}')
if ping -c 1 -W 1 $GATEWAY > /dev/null 2>&1; then
echo "无线网络正常: SSID=$SSID, IP=$IP, 网关可达"
else
echo "无线网络异常: 网关不可达"
exit 1
fi
PowerShell (Windows)
# 获取无线网卡状态
$wifi = Get-NetAdapter | Where-Object {$_.InterfaceDescription -like "*Wireless*" -or $_.Name -like "*Wi-Fi*"}
if (-not $wifi) {
Write-Host "未找到无线网卡" -ForegroundColor Red
exit 1
}
# 检查是否连接
if ($wifi.OperationalStatus -ne "Up") {
Write-Host "无线网卡未启用或未连接" -ForegroundColor Red
exit 1
}
# 检查 IP 地址
$ipConfig = Get-NetIPAddress -InterfaceIndex $wifi.ifIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue
if (-not $ipConfig) {
Write-Host "无线已连接但无 IPv4 地址(DHCP 失败)" -ForegroundColor Red
exit 1
}
# 测试网关
$gateway = (Get-NetRoute -InterfaceIndex $wifi.ifIndex -DestinationPrefix "0.0.0.0/0").NextHop
if (Test-Connection -ComputerName $gateway -Count 1 -Quiet) {
Write-Host "无线网络正常: SSID=$($wifi.Name), IP=$($ipConfig.IPAddress)" -ForegroundColor Green
} else {
Write-Host "无线网络异常: 网关 $gateway 不可达" -ForegroundColor Red
}
综合检测(网络质量 & 速度)
除了连通性,还可以检测延迟和丢包率。
Bash 脚本 (Linux)
#!/bin/bash
TARGET="8.8.8.8"
PING_COUNT=5
# 计算丢包率和平均延迟
RESULT=$(ping -c $PING_COUNT $TARGET 2>&1 | tail -1)
# 提取丢包率(适应不同语言环境)
LOSS=$(echo "$RESULT" | grep -oP '\d+(?=% packet loss)')
if [ -z "$LOSS" ]; then
LOSS=$(echo "$RESULT" | grep -oP '\d+(?=% 丢包)')
fi
# 提取平均延迟
AVG_LATENCY=$(echo "$RESULT" | grep -oP '(?<=min/avg/max/mdev = )[^/]*' | cut -d'/' -f2)
if [ -z "$AVG_LATENCY" ]; then
AVG_LATENCY=$(echo "$RESULT" | grep -oP '(?<=平均 = )[^ms]*')
fi
echo "丢包率: ${LOSS:-100}%"
echo "平均延迟: ${AVG_LATENCY:-N/A} ms"
# 判断标准:丢包率 >= 20% 或延迟 > 500ms 视为异常
if [ "$LOSS" -ge 20 ] 2>/dev/null || [ "$AVG_LATENCY" -gt 500 ] 2>/dev/null; then
echo "无线网络质量差或异常"
else
echo "无线网络质量正常"
fi
针对 macOS 的特殊方法
macOS 使用 airport 工具查看无线状态。
#!/bin/bash
# 获取无线信息
AIRPORT_INFO=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I)
# 提取 SSID、信号强度(RSSI)、噪声、信道
SSID=$(echo "$AIRPORT_INFO" | awk -F': ' '/ SSID/{print $2}')
RSSI=$(echo "$AIRPORT_INFO" | awk -F': ' '/ agrCtlRSSI/{print $2}')
NOISE=$(echo "$AIRPORT_INFO" | awk -F': ' '/ agrCtlNoise/{print $2}')
if [ -z "$SSID" ]; then
echo "未连接到任何无线网络"
exit 1
fi
# 计算信号质量(RSSI 通常在 -30 dBm 到 -90 dBm)
if [ "$RSSI" -le -80 ]; then
QUALITY="差"
elif [ "$RSSI" -le -65 ]; then
QUALITY="一般"
else
QUALITY="好"
fi
echo "连接 SSID: $SSID"
echo "信号强度: ${RSSI} dBm (${QUALITY})"
echo "噪声: ${NOISE} dBm"
# 检查网络连通性
ping -c 2 8.8.8.8 > /dev/null 2>&1 && echo "网络连通: OK" || echo "网络连通: FAIL"
进阶:使用 curl 或 wget 模拟 HTTP 请求
有些网络环境(如酒店/校园网)需要 Portal 认证,Ping 可能通但无法上网,可以通过请求一个明确的 URL 并检查状态码:
# 检测是否被重定向到认证页面
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" --connect-timeout 5 http://www.gstatic.com/generate_204)
if [ "$HTTP_CODE" -eq 204 ] || [ "$HTTP_CODE" -eq 200 ]; then
echo "可正常访问互联网"
elif [ "$HTTP_CODE" -eq 302 ] || [ "$HTTP_CODE" -eq 301 ]; then
echo "需要 Portal 认证"
else
echo "HTTP 异常,状态码: $HTTP_CODE"
fi
推荐的最佳实践组合
| 检测层级 | 脚本推荐 | |
|---|---|---|
| 物理层 | 无线网卡是否连接 SSID | Linux 用 iw,Windows 用 netsh wlan,macOS 用 airport -I |
| 网络层 | 是否有 IPv4 地址 | ip addr / ipconfig / ifconfig |
| 连通性 | 网关是否可达 | Ping 默认网关 |
| 互联网 | 外网 DNS 是否可达 | Ping 114.114.114.114 |
| 应用层 | HTTP 请求是否正常 | curl 请求 204 页面 |
如果需要长期监控,建议将脚本加入 cron(Linux) 或 Task Scheduler(Windows),并结合日志记录与告警。