Linux命令-speedtest-cli(命令行互联网测速)
Linux命令-speedtest-cli(命令行互联网测速)
- 🔰 简介
- 📖 语法
- ⚙️ 选项
- Ookla 官方版常用选项
- Python 版常用选项
- 💡 示例
- 示例 1:基本测速
- 示例 2:列出并选择指定测速服务器
- 示例 3:自动化网络监控脚本
- 示例 4:JSON 和 CSV 输出格式
- 示例 5:带网卡绑定的高级测速
- ⚠️ 注意
- 📚 相关命令
- 📝 总结
快速参考:speedtest-cli是命令行互联网测速工具,通过连接全球 Speedtest 服务器测量网络的上传速度、下载速度和延迟(Ping)。它有两个主要版本:Ookla 官方二进制度和 Python 落地版speedtest-cli。
speedtest-cli特别适合无图形界面的服务器环境,可在 SSH 会话中快速检测网络带宽,常用于服务器网络性能排查和自动化监控。
🔰 简介
Speedtest 最初由 Ookla 公司通过 Web 和 App 提供网络测速服务。speedtest-cli将其搬到了命令行,让服务器管理员和开发者可以:
- 在远程 SSH 会话中测速
- 通过 cron 定时检测网络状态
- 在脚本中集成带宽监控
- 选择特定测速服务器排除干扰
两个版本的区别:
| 特性 | Ookla 官方版 (speedtest) | Python 版 (speedtest-cli) |
|---|---|---|
| 命令名 | speedtest | speedtest-cli |
| 开发方 | Ookla 官方 | 社区(Matt Martz@sivel) |
| 语言 | C/C++ 编译二进制 | Python 脚本 |
| 速度 | 更快 | 较慢(Python 解释) |
| 功能 | 丰富 | 基本 |
| 维护 | 活跃 | 维护中 |
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
安装方式(因发行版和版本选择而异):
# ====== 方式一:Ookla 官方版(推荐)======# Debian/Ubuntu$sudoapt-getinstallspeedtest-cli# 注意:Debian/Ubuntu 的 speedtest-cli 包实际是 Ookla 官方版$whichspeedtest /usr/bin/speedtest# RHEL/CentOS/Fedora(添加 Ookla 仓库)$curl-shttps://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh|sudobash$sudoyuminstallspeedtest# CentOS 7$sudodnfinstallspeedtest# Fedora / CentOS 8+# 通用安装(下载二进制)$sudocurl-Lo/usr/local/bin/speedtest\https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz $sudotar-xzf/tmp/ookla-speedtest-*.tgz-C/usr/local/bin/ $sudochmod+x /usr/local/bin/speedtest# Arch Linux$sudopacman-Sspeedtest-cli# AUR 中的 ookla-speedtest# ====== 方式二:Python 版 ======$ pipinstallspeedtest-cli $whichspeedtest-cli /usr/local/bin/speedtest-cli# 验证安装$ speedtest--versionSpeedtest by Ookla1.2.0.84# 或 Python 版$ speedtest-cli--versionspeedtest-cli2.1.3📖 语法
# Ookla 官方版speedtest[选项]# Python 版speedtest-cli[选项]⚙️ 选项
Ookla 官方版常用选项
| 选项 | 说明 |
|---|---|
--accept-license | 首次运行时接受许可协议(非交互必需) |
--accept-gdpr | 接受 GDPR 数据处理条款 |
-s 服务器ID | 指定测速服务器 ID |
-L | 列出最近的测速服务器 |
--servers | 列出附近所有可用的测速服务器 |
-f 格式 | 输出格式:human-readable(默认)、json、csv、tsv |
-u 单位 | 速度单位(默认Mbps,支持kbps、Mbps、Gbps) |
--progress | 显示进度条(默认yes,可选no) |
-p | 结果显示最多 N 位小数(默认 2) |
-I 接口 | 指定网络接口(如eth0) |
-o 源IP | 指定源 IP 地址 |
--no-upload | 跳过上传测试(仅测下载) |
--no-download | 跳过下载测试(仅测上传) |
--secure | 使用 HTTPS 连接测速服务器 |
Python 版常用选项
| 选项 | 说明 |
|---|---|
--simple | 简洁输出模式(最常用,仅显示 Ping/Download/Upload) |
--list | 列出所有可用服务器 |
--server ID | 指定测速服务器 ID |
--share | 生成包含测速结果的在线分享图片链接 |
--bytes | 以字节/秒(B/s)而非比特/秒(bps)显示 |
--no-upload | 跳过上传测试 |
--no-download | 跳过下载测试 |
--mini URL | 使用自建的 mini speedtest 服务器 |
--csv | CSV 格式输出 |
--json | JSON 格式输出 |
💡 示例
示例 1:基本测速
# ====== Ookla 官方版 ======$ speedtest --accept-license --accept-gdpr Speedtest by Ookla Server: China Mobile - Shanghai(id:12345)ISP: China Telecom Idle Latency:5.23ms(jitter:1.12ms, low:4.10ms, high:8.56ms)Download:287.34Mbps(data used:345.2MB)12.34ms(jitter:3.21ms, low:8.12ms, high:18.23ms)Upload:45.67Mbps(data used:56.8MB)15.67ms(jitter:2.45ms, low:10.23ms, high:22.34ms)Packet Loss:0.0% Result URL: https://www.speedtest.net/result/c/abcd1234-5678-90ab-cdef-1234567890ab# ====== Python 版 ======$ speedtest-cli--simplePing:5.234ms Download:287.34Mbit/s Upload:45.67Mbit/s# 预期输出:# Ping 时间、下载速度、上传速度清晰显示示例 2:列出并选择指定测速服务器
# ====== Ookla 官方版 ======# 列出最近的服务器$ speedtest-LClosest servers: ID Name Location Country12345China Mobile - Shanghai Shanghai CN12346China Telecom - Shanghai Shanghai CN12347China Unicom - Shanghai Shanghai CN12348China Mobile - Beijing Beijing CN12349China Telecom - Beijing Beijing CN# 指定服务器测速$ speedtest-s12345# 强制连接特定服务器,排除自动选择的不确定性# ====== Python 版 ======# 列出所有可用服务器(可能很多!)$ speedtest-cli--list|head-1012345)China Mobile(Shanghai, China)12346)China Telecom(Shanghai, China)12347)China Unicom(Shanghai, China)12348)China Mobile(Beijing, China)12349)China Telecom(Beijing, China)24681)i3D.net(Tokyo, Japan)30456)Ookla(Seoul, South Korea)# 指定服务器 ID 测速$ speedtest-cli--server12345--simplePing:5.123ms Download:289.56Mbit/s Upload:46.78Mbit/s# 预期输出:服务器列表 + 指定服务器的测速结果示例 3:自动化网络监控脚本
#!/bin/bash# 网络带宽定时监控脚本# 通过 cron 每小时执行一次,记录历史带宽数据LOG_DIR="/var/log/network_monitor"LOG_FILE="${LOG_DIR}/bandwidth_$(date+%Y%m).csv"ERROR_LOG="${LOG_DIR}/speedtest_error.log"mkdir-p"$LOG_DIR"# 首次运行时接受许可协议SPEEDTEST="speedtest --accept-license --accept-gdpr"# 测试当前网络TIMESTAMP=$(date'+%Y-%m-%d %H:%M:%S')echo"=== 网络测速开始:$TIMESTAMP==="# 检查网络连通性if!ping-c1-W38.8.8.8>/dev/null2>&1;thenecho"$TIMESTAMP,ERROR,No network connectivity">>"$ERROR_LOG"echo"网络不通,跳过测速"exit1fi# 执行测速(JSON 格式便于解析)RESULT=$($SPEEDTEST-fjson2>/dev/null)if[-n"$RESULT"];then# 使用 jq 解析 JSON 结果SERVER=$(echo"$RESULT"|jq-r'.server.name // "unknown"')PING=$(echo"$RESULT"|jq-r'.ping.latency // 0')DOWNLOAD=$(echo"$RESULT"|jq-r'.download.bandwidth // 0')UPLOAD=$(echo"$RESULT"|jq-r'.upload.bandwidth // 0')PACKET_LOSS=$(echo"$RESULT"|jq-r'.["packetLoss"] // 0')# 转换为 Mbps(原始值单位是 bytes/sec)DOWNLOAD_MBPS=$(echo"scale=2;$DOWNLOAD* 8 / 1000000"|bc)UPLOAD_MBPS=$(echo"scale=2;$UPLOAD* 8 / 1000000"|bc)# 写入 CSV 日志if[!-f"$LOG_FILE"];thenecho"timestamp,server,ping_ms,download_mbps,upload_mbps,packet_loss">"$LOG_FILE"fiecho"$TIMESTAMP,$SERVER,$PING,$DOWNLOAD_MBPS,$UPLOAD_MBPS,$PACKET_LOSS">>"$LOG_FILE"echo"测速结果: Ping=${PING}ms, Download=${DOWNLOAD_MBPS}Mbps, Upload=${UPLOAD_MBPS}Mbps"# 带宽异常告警(下载速度低于 50Mbps 时)if["$(echo"$DOWNLOAD_MBPS< 50"|bc)"-eq1];thenecho"$TIMESTAMP,BANDWIDTH_LOW,Download=${DOWNLOAD_MBPS}Mbps">>"$ERROR_LOG"# 可在此添加邮件/消息告警fielseecho"$TIMESTAMP,ERROR,Speedtest failed">>"$ERROR_LOG"fiecho"=== 网络测速结束 ==="# cron 配置示例:# 0 * * * * /usr/local/bin/network_speedtest.sh # 每小时整点执行示例 4:JSON 和 CSV 输出格式
# ====== JSON 格式(结构化数据,适合程序解析)======$ speedtest --accept-license-fjson{"type":"result","timestamp":"2026-06-14T10:00:00Z","ping":{"jitter":1.123,"latency":5.234,"low":4.100,"high":8.560},"download":{"bandwidth":35937500,"bytes":345200128,"elapsed":9607,"latency":{"iqm":12.345,"low":8.120,"high":18.230,"jitter":3.210}},"upload":{"bandwidth":5708750,"bytes":56800256,"elapsed":9945,"latency":{"iqm":15.678,"low":10.230,"high":22.340,"jitter":2.450}},"packetLoss":0,"isp":"China Telecom","interface":{"internalIp":"192.168.1.100","name":"eth0","macAddr":"00:11:22:33:44:55","isVpn":false,"externalIp":"123.45.67.89"},"server":{"id":12345,"host":"speedtest.shanghai.example.com","port":8080,"name":"China Mobile - Shanghai","location":"Shanghai","country":"China","ip":"10.0.0.1"},"result":{"id":"abcd1234-5678-90ab-cdef-1234567890ab","url":"https://www.speedtest.net/result/c/abcd1234-5678-90ab-cdef-1234567890ab","persisted":true}}# ====== CSV 格式(表格数据,适合导入 Excel)======$ speedtest --accept-license-fcsv type,timestamp,ping.jitter,ping.latency,ping.low,ping.high,download.bandwidth,download.bytes,download.elapsed,upload.bandwidth,upload.bytes,upload.elapsed,packetLoss,isp,interface.internalIp,interface.name,interface.macAddr,interface.isVpn,interface.externalIp,server.id,server.host,server.port,server.name,server.location,server.country,server.ip,result.id,result.url,result.persisted result,2026-06-14T10:00:00Z,1.123,5.234,4.100,8.560,35937500,345200128,9607,5708750,56800256,9945,0,China Telecom,192.168.1.100,eth0,00:11:22:33:44:55,false,123.45.67.89,12345,speedtest.shanghai.example.com,8080,China Mobile - Shanghai,Shanghai,China,10.0.0.1,abcd1234-5678-90ab-cdef-1234567890ab,https://www.speedtest.net/result/c/abcd1234-5678-90ab-cdef-1234567890ab,true示例 5:带网卡绑定的高级测速
# 多网卡服务器指定出口网卡测速$ speedtest-Ieth0# 测试通过 eth0 的网速$ speedtest-Ieth1# 测试通过 eth1 的网速# 指定源 IP 地址$ speedtest-o192.168.1.10# 仅测试下载速度(跳过上传)$ speedtest --no-upload Speedtest by Ookla Server: China Mobile - Shanghai(id:12345)Download:289.56Mbps Upload: SKIPPED# 仅测试上传速度(跳过下载)$ speedtest --no-download Speedtest by Ookla Server: China Mobile - Shanghai(id:12345)Download: SKIPPED Upload:46.78Mbps# 限制速度单位显示$ speedtest-ukbps Speedtest by Ookla Download:294568.96kbps Upload:47896.32kbps# 使用 HTTPS 加密连接$ speedtest--secure# 防止中间设备劫持或干扰测速流量# 预期输出:各场景下对应指标的测试结果⚠️ 注意
测速注意事项:
- 测速消耗流量:一次完整测速可能消耗几百 MB 流量,在按流量计费的 VPS 上请谨慎,可使用
--no-upload减少消耗。 - 时间敏感:网络速度受时段影响大,建议在不同时段多次测试取平均值。
- 服务器选择:自动选择的服务器不一定是最优的,手动指定最近的服务器可得到更准确的结果。
- CPU 影响:低速 CPU 或虚拟化环境可能在高速网络(1Gbps+)下成为瓶颈,测速结果≠网络真实带宽。
- 首次使用:Ookla 官方版首次使用需要
--accept-license和--accept-gdpr,可在~/.config/speedtest/中配置持久化接受。
# 持久化接受许可(避免每次都传参数)$ speedtest --accept-license --accept-gdpr $cat~/.config/ookla/speedtest-cli.json# 许可状态已保存在此文件中Python 版注意:
speedtest-cli(Python 版)有时会在某些地区因为网络限制无法正常列出服务器,Ookla 官方版容错性更好。
📚 相关命令
| 命令 | 说明 |
|---|---|
ping | 网络延迟测试(ICMP 协议) |
iperf3 | 局域网带宽测试工具 |
mtr | 网络路径追踪和丢包率分析 |
curl -o /dev/null -w | 通过下载文件测试 HTTP 下载速度 |
iftop | 实时网络流量监控 |
nload | 网络流量实时查看 |
bmon | 带宽监控和统计 |
📝 总结
speedtest-cli是服务器网络排查的必备工具,让测速不再依赖浏览器:
- 简洁输出:
--simple或默认模式一行结果,清晰直观 - 结构化数据:JSON/CSV 输出方便集成到监控系统
- 服务器可选:手动指定测速节点获得更准确的地区带宽数据
- 自动化友好:
--accept-license+ cron 实现无人值守监控 - 版本选择:优先使用 Ookla 官方版,Python 版作为备选
在服务器上安装speedtest后,建议配合 cron 和脚本实现网络带宽的长期趋势监控,这对排查网络故障、评估 ISP 服务质量非常有价值。
