{"id":45782366,"url":"https://github.com/tsosunchia/inetspeed-cli","last_synced_at":"2026-03-15T20:15:17.400Z","repository":{"id":340589161,"uuid":"1166631466","full_name":"tsosunchia/iNetSpeed-CLI","owner":"tsosunchia","description":"Speedtest.net 命令行工具平替，支持单线程、多线程、延迟采样","archived":false,"fork":false,"pushed_at":"2026-02-27T04:21:12.000Z","size":12528,"stargazers_count":76,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-02T16:46:33.628Z","etag":null,"topics":["speedtest"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tsosunchia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-25T12:38:54.000Z","updated_at":"2026-03-02T07:22:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tsosunchia/iNetSpeed-CLI","commit_stats":null,"previous_names":["tsosunchia/apple-cdn-network-bench","tsosunchia/inetspeed-cli"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/tsosunchia/iNetSpeed-CLI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsosunchia%2FiNetSpeed-CLI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsosunchia%2FiNetSpeed-CLI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsosunchia%2FiNetSpeed-CLI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsosunchia%2FiNetSpeed-CLI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tsosunchia","download_url":"https://codeload.github.com/tsosunchia/iNetSpeed-CLI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsosunchia%2FiNetSpeed-CLI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30051087,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T15:26:47.567Z","status":"ssl_error","status_checked_at":"2026-03-03T15:26:17.132Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["speedtest"],"created_at":"2026-02-26T11:11:30.530Z","updated_at":"2026-03-03T16:01:05.140Z","avatar_url":"https://github.com/tsosunchia.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# iNetSpeed-CLI\n\n\u003e Speedtest.net 命令行工具平替  \n\u003e 支持单线程、多线程、延迟采样  \n\u003e 基于 Apple CDN（OOKLA speedtest.net 的国内节点基本掉光了，但是本工具用的苹果CDN有国内三网节点）\n\n## 从这里开始（30 秒上手）\n\n先选版本：\n\n- **推荐：Go 版本**（单一二进制，零外部依赖，结果更稳定）\n- **兼容：Shell 版本**（适合只想临时跑一轮，或已有脚本环境）\n\n### 方式 A：Go 版本（推荐）\n\nLinux 一键安装：\n\n```bash\ncurl -sL nxtrace.org/speedtest_install | bash\n```\n\nmacOS / Windows：从 Releases 下载预编译包后直接运行：\n\n- \u003chttps://github.com/tsosunchia/iNetSpeed-CLI/releases/latest\u003e\n\n从源码直接运行：\n\n```bash\ngo run ./cmd/speedtest/\n```\n\n### 方式 B：Shell 版本（兼容）\n\n仓库内脚本直接运行：\n\n```bash\nsh scripts/apple-cdn-speedtest.sh\n```\n\n或在线脚本一键测试：\n\n```bash\ncurl -sL nxtrace.org/speedtest | bash\n```\n\n## 仓库资源导航（按用途）\n\n| 你要做什么 | 用哪个资源 |\n|------|------|\n| 完整测速（下载 + 上传 + 延迟） | `cmd/speedtest/main.go`（Go） / `scripts/apple-cdn-speedtest.sh`（Shell） |\n| 只测下载 | `scripts/apple-cdn-download-test.sh` |\n| 只测上传 | `scripts/apple-cdn-upload-test.sh` |\n| 构建多平台二进制 | `scripts/build.sh`（输出到 `dist/`） |\n| 一键安装 Go 版（Linux） | `scripts/install.sh` |\n| 本地质量检查（格式 + vet + test + race + shell） | `scripts/check.sh` |\n\n## 常见使用场景\n\n### 1) 跑一次完整测速（默认配置）\n\n```bash\n# Go 版本\ngo run ./cmd/speedtest/\n\n# Shell 版本\nsh scripts/apple-cdn-speedtest.sh\n```\n\n### 2) 只测下载 / 只测上传（Shell）\n\n```bash\nsh scripts/apple-cdn-download-test.sh\nsh scripts/apple-cdn-upload-test.sh\n```\n\n### 3) 自定义参数测速\n\n```bash\n# Go：环境变量方式\nTIMEOUT=5 MAX=1G THREADS=8 LATENCY_COUNT=10 go run ./cmd/speedtest/\n\n# Go：命令行方式（优先级高于环境变量）\n./speedtest --timeout 5 --max 1G --threads 8 --latency-count 10\n\n# Go：强制中文输出（参数优先级高于环境变量）\n./speedtest --lang zh\n```\n\n## Demo\n\n![speedtest demo](./demo.svg)\n\n---\n\n## Go 版本详细说明\n\n使用 Go 重写，零外部依赖（无需 curl / awk / dd / pv 等），单一二进制即可运行。\n\n### 环境要求\n\n- Go 1.22+（仅构建时需要）\n\n### 构建与运行\n\n```bash\n# 直接运行\ngo run ./cmd/speedtest/\n\n# 构建二进制\ngo build -o speedtest ./cmd/speedtest/\n./speedtest\n\n# 查看版本\n./speedtest --version\n\n# 查看帮助\n./speedtest --help\n\n# 多平台交叉编译（输出到 dist/）\nbash scripts/build.sh\n```\n\n### 一键安装（仅 Linux）\n\n```bash\ncurl -sL nxtrace.org/speedtest_install | bash\n```\n\n- 自动识别 Linux 架构（`amd64`/`arm64`）\n- 从 GitHub Releases 下载最新版本并校验 `sha256`\n- 默认安装目录：`~/.local/bin`（root 为 `/usr/local/bin`）\n- 若目标安装目录不在 `PATH`，则自动回退安装到当前目录（`$PWD`）\n- 可通过 `INSTALL_DIR` 指定安装目录，例如：`INSTALL_DIR=\"$HOME/bin\" bash scripts/install.sh`\n\n### 环境变量\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `DL_URL` | `https://mensura.cdn-apple.com/api/v1/gm/config` 下的 large URL | 下载测试地址 |\n| `UL_URL` | `https://mensura.cdn-apple.com/api/v1/gm/config` 下的 slurp URL | 上传测试地址 |\n| `LATENCY_URL` | `https://mensura.cdn-apple.com/api/v1/gm/config` 下的 small URL | 延迟测试地址 |\n| `MAX` | `2G` | 每线程最大传输量（支持 K/M/G/T 以及 KiB/MiB/GiB/TiB） |\n| `TIMEOUT` | `10` | 每线程传输超时（秒） |\n| `THREADS` | `4` | 多线程并发数 |\n| `LATENCY_COUNT` | `20` | 空载延迟采样次数 |\n| `SPEEDTEST_LANG` | 自动 | 输出语言，`zh` 显示中文，其他显示英文（未设置时读取 `LC_ALL/LC_MESSAGES/LANGUAGE/LANG`） |\n\n### 命令行参数（优先级高于环境变量）\n\n| 参数 | 对应环境变量 | 说明 |\n|------|--------------|------|\n| `--dl-url` | `DL_URL` | 下载测试地址 |\n| `--ul-url` | `UL_URL` | 上传测试地址 |\n| `--latency-url` | `LATENCY_URL` | 延迟测试地址 |\n| `--max` | `MAX` | 每线程最大传输量 |\n| `--timeout` | `TIMEOUT` | 每线程传输超时（秒） |\n| `--threads` | `THREADS` | 多线程并发数 |\n| `--latency-count` | `LATENCY_COUNT` | 空载延迟采样次数 |\n| `--lang` | `SPEEDTEST_LANG` | 输出语言，`zh` 显示中文，其他显示英文（优先级高于环境变量） |\n\n### 输出模式\n\n- **TTY**（终端直连）：彩色输出 + 实时进度刷新（`\\r` 覆盖刷新）\n- **非 TTY**（管道 / CI）：纯文本输出，无 ANSI 转义，无进度行\n\n### 退出码\n\n| 码 | 含义 |\n|----|------|\n| 0 | 全部成功 |\n| 1 | 配置错误（参数非法） |\n| 2 | 完成但部分查询降级（如 ip-api 不可达） |\n| 130 | 被信号中断（Ctrl+C） |\n\n### 节点选择逻辑\n\n1. 并发查询 Cloudflare DoH 和 AliDNS DoH 获取 `mensura.cdn-apple.com` 的 **A + AAAA** 记录（4 路并发：CF-A、CF-AAAA、Ali-A、Ali-AAAA，各 1 秒超时）。\n2. 合并结果：按 CF-A → CF-AAAA → Ali-A → Ali-AAAA 顺序拼接，全局去重后作为候选节点列表（同时支持 IPv4 和 IPv6）。\n3. 仅当某一提供商的 A **和** AAAA 查询都超时时，该提供商才被视为超时；仅当两路都超时时，才触发 system DNS fallback。\n4. 用 ip-api 查询每个 IP 的地域 / ASN 信息（中文环境自动附加 `lang=zh-CN` 参数，获取中文地理信息）。\n5. 交互终端下可手动选择节点；非交互环境默认选择第 1 个。\n6. 选中后通过 HTTP 客户端 DialContext 固定连接目标（等效于 `curl --resolve`）。\n\n### 项目结构\n\n```\ncmd/speedtest/main.go       入口，信号处理\ninternal/\n  config/    配置加载 \u0026 校验 \u0026 单位解析\n  netx/      HTTP/2 客户端工厂 + 端点固定（--resolve 等效）\n  endpoint/  双 DoH（CF+Ali）A+AAAA 双栈解析 + ip-api 地理信息（自动中文） + 节点选择\n  latency/   空载/负载延迟采样 \u0026 统计\n  transfer/  下载/上传传输（单/多线程、双限制）\n  runner/    测试流程编排\n  render/    事件总线 + TTY/Plain 渲染器\n```\n\n### 开发与质量检查\n\n```bash\ngo test ./... -count=1        # 全部 Go 测试\ngo test -race ./... -count=1  # 含竞态检测\nbash scripts/apple-cdn-speedtest_test.sh  # Shell 单元测试\nbash scripts/check.sh         # 本地完整检查（格式 + vet + test + race + shell tests）\n```\n\n### CI / CD\n\n- **CI**（[.github/workflows/ci.yml](.github/workflows/ci.yml)）：push / PR 触发，Go 稳定版 + 上一稳定版矩阵，macOS + Linux，缓存 go mod，运行 `check.sh`。\n- **Release**（[.github/workflows/release.yml](.github/workflows/release.yml)）：`v*` tag 触发，先跑测试，再用 `build.sh` 产出 5 平台二进制（含 `windows/amd64`）+ sha256 校验文件，上传到 GitHub Release。\n\n---\n\n## Shell 脚本版本（原始实现）\n\n### 包含脚本\n\n- `scripts/apple-cdn-speedtest.sh`：完整测速（空载延迟、单/多线程下载、单/多线程上传）\n- `scripts/apple-cdn-download-test.sh`：仅下载测速\n- `scripts/apple-cdn-upload-test.sh`：仅上传测速\n\n### 环境依赖\n\n脚本启动时会进行环境检查，并给出缺失依赖与安装提示。\n\n必需依赖（主脚本）：\n\n- `curl`（必须支持 HTTP/2）\n- `awk`\n- `grep`\n- `sed`\n- `sort`\n- `mktemp`\n- `dd`\n- `wc`\n- `tr`\n- `head`\n\n必需依赖（单项脚本）：\n\n- 下载脚本：`curl`, `awk`, `grep`, `head`, `dd`, `mktemp`, `date`, `cat`\n- 上传脚本：`curl`, `awk`, `dd`, `mktemp`, `date`, `cat`\n\n可选依赖：\n\n- `pv`：用于实时进度显示（缺失不影响测速结果）\n- `getent`/`dig`/`host`/`nslookup`/`ping`：用于 DNS 辅助解析（缺失仅影响部分展示信息）\n\n网络访问要求：\n\n- Apple 测速端点：`https://mensura.cdn-apple.com`\n- Cloudflare DoH：`https://cloudflare-dns.com`（节点选择）\n- AliDNS DoH：`https://dns.alidns.com`（节点选择）\n- ip-api：`http://ip-api.com`（节点地理信息）\n\n### 在线脚本（nxtrace）\n\n```bash\n# 上传速度\ncurl -sL nxtrace.org/upload | bash\n\n# 下载速度\ncurl -sL nxtrace.org/download | bash\n\n# One-key\ncurl -sL nxtrace.org/speedtest | bash\n```\n\n也支持 `https`，将域名前加上 `https://` 即可。\n\n也可以先下载再执行：\n\n```bash\nwget https://nxtrace.org/speedtest\nchmod +x speedtest\n./speedtest\n```\n\n### 常用环境变量（Shell 版）\n\n主脚本（`scripts/apple-cdn-speedtest.sh`）：\n\n- `DL_URL`：下载 URL\n- `UL_URL`：上传 URL\n- `LATENCY_URL`：延迟探测 URL\n- `MAX`：每线程最大传输量（默认 `2G`）\n- `TIMEOUT`：每线程测试时长（默认 `10` 秒）\n- `THREADS`：多线程并发数（默认 `4`）\n- `LATENCY_COUNT`：空载延迟采样次数（默认 `20`）\n\n示例：\n\n```bash\nTIMEOUT=5 MAX=1G THREADS=8 LATENCY_COUNT=10 sh scripts/apple-cdn-speedtest.sh\n```\n\n### 节点选择逻辑（Shell 版）\n\n1. 并发查询 Cloudflare DoH 和 AliDNS DoH 获取 `mensura.cdn-apple.com` 的 **A + AAAA** 记录（4 路并发：CF-A、CF-AAAA、Ali-A、Ali-AAAA，各 1 秒超时）。\n2. 合并结果：按 CF-A → CF-AAAA → Ali-A → Ali-AAAA 顺序拼接，全局去重后作为候选节点列表（同时支持 IPv4 和 IPv6）。\n3. 仅当某一提供商的 A **和** AAAA 查询都超时时，该提供商才被视为超时；仅当两路都超时时，才触发 system DNS fallback。\n4. 用 ip-api 查询每个 IP 的地域/ASN 信息（中文环境自动附加 `lang=zh-CN` 参数，获取中文地理信息）。\n5. 交互终端下可手动选择节点；非交互环境默认选择第 1 个。\n6. 选中后通过 `curl --resolve host:443:IP` 固定后续测试连接目标。\n\n## 许可证\n\n本项目采用 **GNU General Public License v3.0 (GPL-3.0-or-later)** 开源。\n\n- 许可证全文见 `LICENSE`。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftsosunchia%2Finetspeed-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftsosunchia%2Finetspeed-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftsosunchia%2Finetspeed-cli/lists"}