本文目录导读:

- 方法一:使用 iPerf3(最专业、最准确)
- 方法二:使用 speedtest-cli(适合测试互联网带宽)
- 方法三:使用 curl 和 wget(简单测速)
- 方法四:使用 nc(netcat,适合极简场景)
- 完整脚本模板(推荐组合方案)
- 总结建议
在脚本中进行网络带宽测试,通常有几种成熟的方法,具体取决于你的环境(Linux/Windows)、是否需要安装工具,以及测试的是内部网络还是互联网带宽。
以下是几种主流的脚本化带宽测试方案,按推荐程度排序:
使用 iPerf3(最专业、最准确)
iPerf3 是行业标准的带宽测试工具,适合测试局域网或两台特定服务器之间的带宽。
原理: 需要一端运行服务器模式,另一端运行客户端模式。
脚本步骤:
-
服务端(Server): 监听 5201 端口。
#!/bin/bash # 启动 iperf3 服务器,后台运行 iperf3 -s -D echo "iPerf3 Server started."
-
客户端(Client): 连接服务端进行测试。
#!/bin/bash SERVER_IP="192.168.1.100" DURATION=30 # 测试时长(秒) # 执行测试并提取带宽结果 RESULT=$(iperf3 -c $SERVER_IP -t $DURATION -J 2>/dev/null | grep -o '"bits_per_second": [0-9]*\.[0-9]*') echo "Bandwidth: $RESULT bits/sec" # 或者用友好格式输出 iperf3 -c $SERVER_IP -t $DURATION -f M # 以 Mbps 输出
注意事项:
- 需要两端都安装
iperf3:apt install iperf3(Debian/Ubuntu) 或yum install iperf3(CentOS/RHEL)。 - 如果防火墙开启,请放行 TCP 5201 端口。
-J参数输出 JSON,方便脚本解析。
使用 speedtest-cli(适合测试互联网带宽)
如果你的目标是测试VPS 到公网的带宽(如去程、回程速度),speedtest-cli 是最常用的方案。
安装:
# 使用 Python pip 安装 pip install speedtest-cli # 或者 Linux 直接下载 curl -s https://install.speedtest.net/app/cli/install.deb.sh | sudo bash sudo apt-get install speedtest-cli
脚本示例:
#!/bin/bash
echo "Testing internet speed..."
# 简单测试,输出下载和上传速度(Mbps)
speedtest-cli --simple
# 进阶:输出 JSON 格式,只提取下载速度
RESULT=$(speedtest-cli --json 2>/dev/null | python3 -c "import sys, json; data = json.load(sys.stdin); print('Download: {:.2f} Mbps'.format(data['download'] / 1e6))")
echo "$RESULT"
# 如果不想显示详情,只取结果(适用于监控)
speedtest-cli --no-upload # 仅测下载
注意事项:
- 测试结果受当前网络拥塞影响较大,建议测试 3 次取平均值。
- 免费版 Speedtest 的服务器节点可能不是最优的,可以用
--list选择指定服务器。
使用 curl 和 wget(简单测速)
如果你的环境受限,无法安装额外工具,可以用 curl 或 wget 下载一个已知大小的文件来估算带宽。
脚本示例:
#!/bin/bash
# 选择一个速度快的测试文件,如 Speedtest 提供的文件
URL="http://speedtest.tele2.net/100MB.zip"
echo "Starting download test..."
START_TIME=$(date +%s)
# 下载文件,输出重定向到 /dev/null
wget -O /dev/null $URL 2>&1 | tail -3
END_TIME=$(date +%s)
# 计算耗时
DURATION=$((END_TIME - START_TIME))
SIZE_MB=100 # 100MB 文件
SPEED=$(echo "scale=2; ($SIZE_MB * 8) / $DURATION" | bc) # 转换为 Mbps
echo "Estimated bandwidth: ${SPEED} Mbps"
局限性:
- 不够精确:受服务器负载、磁盘 I/O 影响大。
- 耗时较长:需要下载完整个文件。
- 建议使用大文件(100MB 以上)以减少误差。
使用 nc(netcat,适合极简场景)
如果连 iperf3 都没有,可以用 nc 配合 dd 做原始数据流测试。
服务端:
nc -l -p 9999 > /dev/null
客户端:
dd if=/dev/zero bs=1M count=1024 | nc <SERVER_IP> 9999
然后通过统计时间手动计算。
完整脚本模板(推荐组合方案)
以下是一个综合脚本,自动探测工具并执行:
#!/bin/bash
# 网络带宽测试脚本
# 依赖检查:iPerf3 > Speedtest CLI > Curl
TARGET_IP="${1:-192.168.1.1}" # 默认目标 IP
DURATION=20
echo "=== Network Bandwidth Test ==="
# 1. 检查 iPerf3
if command -v iperf3 &> /dev/null; then
echo "[iPerf3] Testing bandwidth to $TARGET_IP..."
iperf3 -c $TARGET_IP -t $DURATION -f M --omit 3 2>/dev/null | tail -3
echo "Done."
exit 0
fi
# 2. 检查 Speedtest
if command -v speedtest-cli &> /dev/null; then
echo "[Speedtest] Testing internet bandwidth..."
speedtest-cli --simple
exit 0
fi
# 3. 使用 Curl 备用
if command -v curl &> /dev/null; then
echo "[Curl] Estimating bandwidth (approximate)..."
URL="http://speedtest.tele2.net/100MB.zip"
START_TIME=$(date +%s%N)
curl -o /dev/null -s -w '%{speed_download}\n' $URL > /tmp/speed_file
END_TIME=$(date +%s%N)
DURATION=$(( (END_TIME - START_TIME) / 1000000 )) # ms
SPEED=$(echo "scale=2; (100*8*1000) / ($DURATION)" | bc)
echo "Estimated Bandwidth: ${SPEED} Mbps"
exit 0
fi
echo "Error: No suitable tool found (iperf3, speedtest-cli, curl)."
exit 1
总结建议
| 场景 | 推荐工具 | 脚本化难度 | 数据用途 |
|---|---|---|---|
| 内网/点对点带宽 | iPerf3 | 低 | 精准容量规划 |
| 出口带宽/公网测速 | Speedtest CLI | 低 | 日常监控 |
| 受限环境/一次性测试 | curl + 文件下载 |
高 | 粗略估算 |
| 无任何依赖 | nc + dd |
高 | 极简可用 |
重要提醒:
- 权限:很多脚本需要 root 或 sudo 权限来安装工具或打开低端口。
- 防火墙:使用 iPerf3 时,务必检查防火墙是否阻挡了测试端口(默认 5201)。
- 并发限制:脚本中测试带宽可能会消耗大量 CPU 和网络资源,建议在脚本中加入
sleep或限制同时运行的测试数量。