脚本中网络带宽测试怎样进行

wen 实用脚本 7

本文目录导读:

脚本中网络带宽测试怎样进行

  1. 方法一:使用 iPerf3(最专业、最准确)
  2. 方法二:使用 speedtest-cli(适合测试互联网带宽)
  3. 方法三:使用 curl 和 wget(简单测速)
  4. 方法四:使用 nc(netcat,适合极简场景)
  5. 完整脚本模板(推荐组合方案)
  6. 总结建议

在脚本中进行网络带宽测试,通常有几种成熟的方法,具体取决于你的环境(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 输出

注意事项:

  • 需要两端都安装 iperf3apt 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(简单测速)

如果你的环境受限,无法安装额外工具,可以用 curlwget 下载一个已知大小的文件来估算带宽。

脚本示例:

#!/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 或限制同时运行的测试数量。

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