本文目录导读:

要用脚本自动测试网络带宽,最常用的工具是 Speedtest CLI(由 Ookla 提供)或 iperf3,以下是几种脚本化实现的方法,涵盖 Linux、Windows 和 macOS。
使用 Speedtest CLI(最推荐,适合单点测速)
安装
# Linux (Ubuntu/Debian) sudo apt-get install speedtest-cli # macOS brew install speedtest-cli # Windows (下载官方exe后放入PATH) # 或使用 pip pip install speedtest-cli
基本测速脚本(Bash)
#!/bin/bash
echo "=== 带宽测试开始 $(date) ==="
speedtest-cli --json 2>/dev/null | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(f'下载: {data[\"download\"]/1e6:.2f} Mbps')
print(f'上传: {data[\"upload\"]/1e6:.2f} Mbps')
print(f'延迟: {data[\"ping\"]} ms')
"
支持定时测试(使用cron)
# 每2小时运行一次,结果写入日志 0 */2 * * * /path/to/speedtest.sh >> /var/log/bandwidth.log 2>&1
Python 脚本(更灵活)
import speedtest
import json
from datetime import datetime
def test_bandwidth():
st = speedtest.Speedtest()
st.get_best_server()
# 获取下载/上传速度(bit/s)
download_speed = st.download() / 1_000_000 # Mbps
upload_speed = st.upload() / 1_000_000
result = {
"timestamp": datetime.now().isoformat(),
"download_mbps": round(download_speed, 2),
"upload_mbps": round(upload_speed, 2),
"ping_ms": st.results.ping
}
return result
if __name__ == "__main__":
res = test_bandwidth()
print(json.dumps(res, indent=2))
使用 iperf3(适合局域网/点对点测试)
服务端启动(需在远程机器运行)
# 监听端口5201 iperf3 -s
客户端脚本(测试到服务端的带宽)
#!/bin/bash
SERVER_IP="192.168.1.100"
DURATION=10
echo "测试到 $SERVER_IP 的带宽..."
# 下载测试(客户端角度)
iperf3 -c $SERVER_IP -t $DURATION -f m | grep -E "sender|receiver" | while read line; do
echo "$line"
done
批量测试多个节点的 Python 脚本
import subprocess
import re
import json
def test_iperf(server_ip, duration=10):
cmd = f"iperf3 -c {server_ip} -t {duration} -f m"
result = subprocess.run(cmd.split(), capture_output=True, text=True)
# 提取发送/接收速率
match = re.findall(r'([\d.]+) Mbits/sec', result.stdout)
return {
"server": server_ip,
"sender_mbps": float(match[0]) if len(match) > 0 else 0,
"receiver_mbps": float(match[1]) if len(match) > 1 else 0
}
servers = ["192.168.1.100", "10.0.0.1"]
for srv in servers:
data = test_iperf(srv)
print(json.dumps(data))
集成告警与存档(完整示例)
#!/usr/bin/env python3
import speedtest
import sqlite3
import smtplib
from email.mime.text import MIMEText
from datetime import datetime
def test_and_store():
# 1. 测速
st = speedtest.Speedtest()
st.get_best_server()
dl = st.download() / 1e6
ul = st.upload() / 1e6
ping = st.results.ping
# 2. 存入SQLite
conn = sqlite3.connect("/var/log/bandwidth.db")
conn.execute('''CREATE TABLE IF NOT EXISTS tests
(timestamp TEXT, download REAL, upload REAL, ping REAL)''')
conn.execute("INSERT INTO tests VALUES (?,?,?,?)",
(datetime.now().isoformat(), dl, ul, ping))
conn.commit()
# 3. 告警阈值检查
if dl < 50 or ul < 10: # 小于50Mbps下载/10Mbps上传告警
send_alert(f"带宽异常: 下载={dl:.2f}Mbps 上传={ul:.2f}Mbps")
conn.close()
return dl, ul, ping
def send_alert(msg):
# 配置邮件发送
pass
if __name__ == "__main__":
test_and_store()
注意事项
- Speedtest CLI 限制:免费版有每日测试次数限制(Ookla 官方的 speedtest-cli 约 500次/天)。
- iperf3 需要双向:确保服务端已启动,防火墙开放端口(默认5201)。
- 并发测试:如果同时跑多个 iperf 实例,可能因带宽抢占导致结果不准确。
- 最小化干扰:测试期间关闭其他大流量应用(如视频、下载)。
推荐方案选择
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 家庭宽带稳定性 | Speedtest CLI | 直接测运营商带宽 |
| 公司内网质量 | iperf3 | 可点对点测量真实吞吐 |
| 跨国节点监控 | Speedtest CLI + 多服务器 | 支持全球节点选择 |
| 自动化监控集成 | Python + speedtest-cli | 易与Prometheus/Grafana结合 |
如果需要更复杂的定时任务、历史趋势图表或邮件告警,我可以帮你进一步扩展脚本。