如何用实用脚本检测网络连通性?

wen 实用脚本 5

从入门到精通的全面指南

目录导读

  1. 为什么需要脚本检测网络连通性?
  2. 基础Ping脚本:快速验证主机可达性
  3. 进阶TCP/UDP端口检测脚本
  4. 多目标并发检测脚本(提升效率)
  5. 日志与告警集成:自动记录异常
  6. 跨平台脚本:Windows与Linux双适配
  7. 常见问答(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需安装),将socketsubprocess结合,一行代码适配两系统。

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分钟后,您就能看到第一份自动生成的连通性报告。

上一篇哪些实用脚本能简化Excel操作?

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!