从入门到精通的全面指南
目录导读
- 为什么需要脚本检测网络连通性?
- 基础Ping脚本:快速验证主机可达性
- 进阶TCP/UDP端口检测脚本
- 多目标并发检测脚本(提升效率)
- 日志与告警集成:自动记录异常
- 跨平台脚本:Windows与Linux双适配
- 常见问答(FAQ)
为什么需要脚本检测网络连通性?
网络连通性是运维和开发中最基础却最关键的指标,手动逐条ping命令效率低、易遗漏,尤其在拥有数百台服务器、微服务或跨地域网络环境中,自动化脚本成为刚需。

真实场景:某电商公司凌晨3点发现支付接口超时,手动测试需5分钟,而脚本每30秒自动检测并在异常时发送告警,将故障响应时间缩短至30秒内。
脚本检测的核心优势:
- 可重复性:定时执行,无需人工干预。
- 多维检测:不仅测ICMP,还能测TCP端口、HTTP状态码、DNS解析等。
- 结果结构化:输出JSON/CSV,便于集成到监控系统(如Prometheus、Zabbix)。
基础Ping脚本:快速验证主机可达性
最简单的脚本基于系统ping命令,但需注意:Windows与Linux的ping参数不同。
Windows版本(batch脚本):
@echo off
set target=myhost.example.com
ping -n 2 %target% >nul
if %errorlevel%==0 (
echo %date% %time% - %target% 连通成功
) else (
echo %date% %time% - %target% 连通失败
)
Linux版本(Bash脚本):
#!/bin/bash
TARGET="myhost.example.com"
ping -c 2 $TARGET > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "$(date) - $TARGET 连通成功"
else
echo "$(date) - $TARGET 连通失败"
fi
注意:部分云服务器禁ping,此时需改用TCP端口检测(见下一节)。
进阶TCP/UDP端口检测脚本
仅ping无法判断服务是否正常运行(如Web服务80端口可能宕机),使用nc(netcat)或telnet检测端口。
检测TCP端口(Linux):
#!/bin/bash
HOST="api.example.com"
PORT=443
timeout 3 bash -c "echo >/dev/tcp/$HOST/$PORT" 2>/dev/null
if [ $? -eq 0 ]; then
echo "$(date) - $HOST:$PORT 端口开放"
else
echo "$(date) - $HOST:$PORT 端口未响应"
fi
检测UDP端口(需特殊工具):
UDP无连接状态,建议使用nmap或特定协议检测(如DNS查询)。
# 依赖nmap nmap -sU -p 53 dns.example.com | grep -q "open"
跨平台方案:使用Python的socket模块(已内置),无需额外工具:
import socket
host = "myhost.example.com"
port = 80
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
result = s.connect_ex((host, port))
print("连通") if result == 0 else print("失败")
s.close()
多目标并发检测脚本(提升效率)
单线程逐个检测100个目标需数分钟,并发检测可压缩至数秒。
Bash并发版(利用&后台进程):
#!/bin/bash
HOSTS=("host1.example.com" "host2.example.com" "host3.example.com")
for host in "${HOSTS[@]}"; do
ping -c 1 $host >/dev/null 2>&1 && echo "$host: 连通" || echo "$host: 不通" &
done
wait
Python多线程版(更稳定):
import concurrent.futures
import subprocess
def check_host(host):
result = subprocess.run(['ping', '-c', '1', host], capture_output=True)
return f"{host}: {'连通' if result.returncode==0 else '不通'}"
hosts = ["host1.example.com", "host2.example.com", "host3.example.com"]
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
results = executor.map(check_host, hosts)
for r in results:
print(r)
性能对比:单线程100次ping耗时约120秒,10并发仅需12秒,减少90%时间。
日志与告警集成:自动记录异常
检测结果需持久化存储,并触发告警(邮件、短信、企业微信等)。
生成JSON日志(Python示例):
import json, datetime
log_entry = {
"timestamp": datetime.datetime.now().isoformat(),
"host": "myhost.example.com",
"status": "failed",
"latency_ms": None
}
with open("network_log.json", "a") as f:
f.write(json.dumps(log_entry) + "\n")
集成告警(通过curl发送到企业微信):
if [ $? -ne 0 ]; then
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"告警:$HOST 无法连通\"}}"
fi
自动清理旧日志:配合cron每日执行find /var/log/network -mtime +30 -delete。
跨平台脚本:Windows与Linux双适配
使用Python(无需修改即可跨平台)或ansible剧本。
PowerShell脚本(Windows原生):
$targets = @("host1.example.com", "host2.example.com")
foreach ($t in $targets) {
if (Test-Connection -ComputerName $t -Count 1 -Quiet) {
Write-Output "$t 连通"
} else {
Write-Output "$t 不通"
}
}
Ansible剧本(运维自动化):
- name: 检测网络连通性
hosts: all
tasks:
- name: ping测试
ping:
register: result
- name: 输出结果
debug:
msg: "连通成功" if result.ping == "pong" else "连通失败"
常见问答(FAQ)
Q1:检测到ping通但服务却不可用,怎么办?
A:ping只能确认网络层连通,应用层需检测端口(如80、443),建议组合使用ping + TCP端口检测脚本。
Q2:脚本在Windows和Linux上都要运行,如何统一?
A:推荐Python脚本,系统内置python3(Windows需安装),将socket和subprocess结合,一行代码适配两系统。
Q3:如何检测某IP的丢包率?
A:使用ping -c 100统计回复包数量,公式:丢包率 = (1 - 成功数/总数) * 100%,建议用Python解析ping输出。
Q4:脚本检测频率多高合适?
A:一般业务建议30秒~5分钟,高频(<5秒)可能被误认为攻击,低频(>10分钟)可能错过故障窗口,根据网络规模调整。
Q5:检测结果如何可视化?
A:可将JSON日志导入Grafana的Elasticsearch或Prometheus数据源,使用Line Chart展示连通率趋势,饼图展示故障比例。
从基础ping到并发TCP检测,再到日志告警与跨平台适配,脚本化网络连通性检测已覆盖运维全场景,核心建议:从简单开始,逐步加入端口检测、并发、日志与告警,掌握这些脚本后,您将不再需要手动逐台敲命令,网络故障排查效率提升10倍以上。
下一步行动:选择一个脚本,修改目标IP列表,部署到您的服务器上,5分钟后,您就能看到第一份自动生成的连通性报告。