网络工具实战:curl、wget 与网络诊断

Termux 无 Root 学习开发系列 · 阶段三:网络与远程操作 · 第 11 篇 · 难度:进阶
📚 Termux 无 Root 学习开发系列
阶段一:环境搭建
01-05 Termux 安装 → 包管理 → 文件管理 → Vim/tmux
阶段二:编程开发环境
06-09 Python → C/C++ → Node.js → Git
阶段三:网络与远程操作
10 SSH 远程连接与端口转发
11 网络工具实战(当前篇)
12 网络代理与安全通信
读完本篇你将能:用 curl 发送 GET/POST 请求并调试 API 接口,用 wget 递归下载和断点续传,用 ping/traceroute/dig 诊断网络故障,用 nmap 在无 root 下扫描端口与服务,用 jq 提取 JSON 数据,用 yt-dlp 下载视频音频。

上一篇我们打通了 SSH 隧道,手机和服务器之间的加密通道已经建立。但网络世界不只是 SSH——当你需要调用一个 REST API 下载天气数据、诊断为什么网页打不开、或者从 Bilibili 下载一段教学视频时,你需要更丰富的网络工具。本篇就是 Termux 网络工具箱的完整盘点。如果上一篇的 SSH 是铺设高速公路,这篇就是教你开各种车上路——货车拉数据、巡逻车查故障、救护车救连接。

📑 本文目录
01curl:HTTP 请求全能选手
02wget:递归下载与断点续传
03网络诊断:ping、traceroute、mtr
04DNS 查询:dig 与 nslookup
05nmap 端口扫描(无 root 受限)
06端口与连接:ss 命令
07jq:JSON 数据提取利器
08yt-dlp:视频下载实战

01 curl:HTTP 请求全能选手

curl 是最常用的命令行 HTTP 客户端,支持 HTTP/HTTPS/FTP 等 20 多种协议。Termux 中通常已预装 curl,如果没有就手动安装:

Bash
pkg install curl -y
curl --version | head -1

预期输出 curl 8.21.0(2026 年 6 月发布,当前稳定版)。

GET 请求:最基本的数据获取

用 curl 调用一个公开 API——获取你的公网 IP 地址:

Bash
curl http://httpbin.org/ip

返回 JSON 格式的数据:

Output
{
  "origin": "223.104.1.100"
}

POST 请求:提交数据

用 -X 指定方法,-d 传递数据,-H 设置请求头:

Bash
1
2
3
4
5
6
7
8
# 提交 JSON 数据
curl -X POST http://httpbin.org/post \
  -H "Content-Type: application/json" \
  -d '{"name":"Termux","version":"0.119"}'
# 上传文件(-F 表单方式)
curl -X POST http://httpbin.org/post \
  -F "file=@photo.jpg" \
  -F "description=手机截图"

调试技巧:查看请求与响应详情

-v 显示完整的请求/响应过程,调试 API 问题时必不可少:

Bash
curl -v https://api.github.com/users/torvalds 2>&1 | head -20

2>&1 将 stderr(curl -v 的信息输出到 stderr)合并到 stdout 以便管道处理。输出包含:

Output(前20行)
* Trying 140.82.114.4:443...
* Connected to api.github.com (140.82.114.4) port 443
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
> GET /users/torvalds HTTP/2
> Host: api.github.com
> User-Agent: curl/8.21.0
> Accept: */*
< HTTP/2 200
< server: GitHub.com
< x-ratelimit-remaining: 59

> 开头是请求头,< 开头是响应头。你可以看到 TLS 握手过程、HTTP/2 协议、以及速率限制 x-ratelimit-remaining: 59 等信息。

💡 小贴士
curl 的 -s(静默模式)配合 -o(输出到文件)是脚本中下载文件的推荐组合:curl -sL https://example.com/file.zip -o file.zip。-L 跟随重定向,避免下载到一堆 301 HTML。

02 wget:递归下载与断点续传

wget 和 curl 功能有重叠,但各有侧重:curl 擅长 API 调试和复杂请求,wget 擅长递归下载整站和断点续传。安装 wget:

Bash
pkg install wget -y
wget --version | head -1

预期输出 GNU Wget 1.25.0(当前稳定版)。

断点续传:下载大文件不怕断线

-c 参数让 wget 在中断后继续下载,而非从头开始:

Bash
# 下载 Ubuntu 镜像(大文件)
wget -c https://releases.ubuntu.com/24.04/ubuntu-24.04-desktop-amd64.iso
# 如果中断了,再次运行同一命令会继续:
wget -c https://releases.ubuntu.com/24.04/ubuntu-24.04-desktop-amd64.iso
Resuming ubuntu-24.04-desktop-amd64.iso at offset 1048576
100%[============>] 4,800,000,000 2.4MB/s

递归下载:镜像整个网站

wget 的递归下载功能可以把一个网站的静态页面全部下载到本地:

Bash
1
2
3
4
5
6
7
# 递归下载,深度2层,转为本地链接
wget -r -l 2 -k -p https://example.com/docs/
# -r 递归下载 -l 2 限制深度2层
# -k 转为本地可浏览链接
# -p 下载页面所需的所有资源(CSS/图片)
# 结果保存在 example.com/ 目录下
⚠️ 常见错误
wget -r https://example.com — 没有限制递归深度,wget 会爬取整个网站直到服务器封禁或存储空间耗尽
✓ 正确:始终用 -l 限制深度,加 -w 2 每次请求间隔 2 秒,避免对服务器造成压力。--limit-rate=100k 可以限制下载速度。

03 网络诊断:ping、traceroute、mtr

当网络出问题时——网页打不开、SSH 连不上——你需要诊断工具定位故障点。三个工具由浅入深:ping 测通不通,traceroute 看哪里断了,mtr 实时监控整条路径。

ping:连通性检测

ping 发送 ICMP 回显包,测试目标是否可达以及延迟多少:

Bash
ping -c 4 8.8.8.8

-c 4 发送 4 个包后停止(不加会无限发送,需要 Ctrl+C 中断):

Output
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=117 time=12.3 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=11.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=12.1 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=11.9 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss
round-trip min/avg/max = 11.8/12.0/12.3 ms

关键看 packet loss(丢包率)和 time(延迟)。0% 丢包 + 低延迟 = 网络通畅。

traceroute:追踪路由路径

traceroute 显示数据包从你的手机到目标服务器经过的每一跳路由器:

Bash
pkg install traceroute -y
traceroute -m 10 8.8.8.8

-m 10 限制最多 10 跳(默认 30,手机网络通常不需要这么多):

Output
traceroute to 8.8.8.8 (8.8.8.8), 10 hops max
 1  192.168.1.1     2.1 ms
 2  10.0.0.1       8.3 ms
 3  100.64.0.1    15.2 ms
 4  8.8.8.8       12.0 ms

如果某一跳出现 *(超时),说明该路由器不响应或不可达。如果到第 3 跳正常但第 4 跳全超时,故障在 3 到 4 之间。

mtr:ping + traceroute 合体

mtr 是 ping 和 traceroute 的结合体——持续发送探测包并实时更新每一跳的丢包率和延迟。安装:

Bash
pkg install mtr -y
# 非交互模式,发10个包后输出报告
mtr --report --report-cycles 10 8.8.8.8

mtr 会持续运行并实时刷新每一跳的统计数据(丢包率、平均延迟、最佳/最差延迟),按 q 退出。在手机上用 --report 模式更方便,发完指定数量的包后自动输出报告。

04 DNS 查询:dig 与 nslookup

DNS 把域名翻译成 IP。当出现"域名能 ping 通但网页打不开"的问题时,DNS 查询工具帮你判断解析是否正确。

dig(Domain Information Groper)是专业级 DNS 查询工具:

Bash
pkg install bind-tools -y
dig github.com

输出中最重要的部分是 ANSWER SECTION:

Output
;; ANSWER SECTION:
github.com. 300 IN A 20.205.243.166
;; Query time: 23 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)

各字段含义:域名、TTL(300 秒缓存)、记录类型(A = IPv4 地址)、IP 地址。最后的 SERVER 行显示你用的是哪个 DNS 服务器。

查询特定记录类型,比如 MX(邮件交换记录):

Bash
dig gmail.com MX +short
5 gmail-smtp-in.l.google.com.
10 alt1.gmail-smtp-in.l.google.com.

+short 只输出精简结果,适合脚本中使用。nslookup 是更简单的替代品,交互式使用更直观:

Bash
nslookup github.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
Name: github.com
Address: 20.205.243.166

05 nmap 端口扫描(无 root 受限)

nmap 是最知名的网络扫描工具,用于发现主机、扫描开放端口、识别服务版本。Nmap 7.991 于 2026 年 8 月发布,是当前最新版。在 Termux 无 root 环境下,nmap 无法使用 SYN 半开扫描(需要 raw socket 权限),但 TCP connect 扫描完全可用。

Bash
pkg install nmap -y
nmap --version | head -1

扫描云服务器常见端口:

Bash
# 扫描指定端口
nmap -sT -p 22,80,443,8022 8.137.176.208
Output
Starting Nmap 7.991 ( https://nmap.org )
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
8022/tcp closed unknown

-sT 是 TCP connect 扫描,无 root 下唯一可用的扫描方式。服务版本探测:

Bash
# 版本探测 + 常见端口
nmap -sT -sV -p 22,80,443 8.137.176.208

-sV 会尝试识别端口上运行的具体服务版本,输出中会多出 VERSION 列:

Output
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 10.5
80/tcp open http nginx 1.27.0
443/tcp open https nginx 1.27.0
💡 小贴士
无 root 环境下 nmap 不能使用 -sS(SYN 扫描)、-O(操作系统探测)、-sn(ICMP 主机发现)等需要 raw socket 的功能。但 -sT(TCP connect)、-sV(版本探测)、--script(NSE 脚本)均可用,日常使用完全够用。

06 端口与连接:ss 命令

ss(socket statistics)是 netstat 的现代替代品,用于查看当前网络连接和监听端口。当你启动了一个服务但不确定是否在运行时,ss 一查便知。

查看所有监听端口:

Bash
ss -tlnp

参数解释:-t TCP 连接,-l 仅监听状态,-n 不解析服务名(显示端口号),-p 显示进程信息。

启动 sshd 后查看:

Output
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:8022 0.0.0.0:*
# 8022 端口正在监听,说明 sshd 正常运行

查看已建立的连接:

Bash
ss -tn | head -10
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.108:43210 8.137.176.208:22

ESTAB 表示已建立的连接——你的手机正连接到云服务器的 22 端口。

07 jq:JSON 数据提取利器

现代 API 几乎都返回 JSON 格式数据。jq 是命令行 JSON 处理器——它能把一大坨压缩的 JSON 解析成可读的格式,还能用过滤表达式提取特定字段。curl + jq 是 Termux 中调试 API 的黄金组合。

Bash
pkg install jq -y

格式化与提取

调用 GitHub API 获取用户信息,用 jq 美化输出:

Bash
curl -s https://api.github.com/users/torvalds | jq .

jq . 把 JSON 格式化输出。提取特定字段:

Bash
1
2
3
4
5
6
7
8
# 提取单个字段
curl -s https://api.github.com/users/torvalds | jq '.login'
"torvalds"
# 提取多个字段组成新对象
curl -s https://api.github.com/users/torvalds | jq '{name,company,public_repos,followers}'
{
  "name": "Linus Torvalds",
  "public_repos": 7
}

处理数组和管道

API 返回数组时,用 .[] 遍历,用管道 | 串联过滤:

Bash
1
2
3
4
5
6
7
# 获取 GitHub 仓库列表,提取仓库名和星数
curl -s https://api.github.com/users/torvalds/repos \
  | jq '.[] | {name,stargazers_count}'
{"name":"linux","stargazers_count":180000}
{"name":"subsurface","stargazers_count":1200}
# 按星数降序排列,取前3名
curl -s .../repos | jq 'sort_by(-.stargazers_count) | .[0:3] | .[].name'
💡 小贴士
jq 的 -r 参数输出原始值(不加引号),非常适合管道传递:curl -s api | jq -r '.ip' 输出 223.104.1.100 而非 "223.104.1.100"。配合 xargs 可以把结果传给下一个命令。

08 yt-dlp:视频下载实战

yt-dlp 是 youtube-dl 的活跃分支,支持 1000+ 视频网站,包括 YouTube、Bilibili 等。当前稳定版 2026.07.04,要求 Python 3.11+(Termux 默认 Python 已满足)。安装方式直接用 pip:

Bash
pip install -U yt-dlp
yt-dlp --version
2026.07.04

下载视频

最简单的用法——直接给 URL:

Bash
1
2
3
4
5
6
7
8
9
# 查看可选格式(不下载)
yt-dlp -F https://www.bilibili.com/video/BV1xx411c7mD
# 选择最佳画质下载
yt-dlp -f "bestvideo+bestaudio" BV1xx411c7mD
# 仅下载音频(播客/音乐)
yt-dlp -x --audio-format mp3 BV1xx411c7mD
# 下载字幕(如果有)
yt-dlp --write-subs --write-auto-subs --sub-langs en,zh BV1xx411c7mD

-F 列出所有可用格式,-f 指定格式,-x 仅提取音频。

下载到指定目录并重命名:

Bash
yt-dlp -o "~/downloads/%(title)s.%(ext)s" BV1xx411c7mD

%(title)s 是视频标题,%(ext)s 是扩展名。下载完成后文件会保存到 ~/downloads/ 目录。

⚠️ 常见错误
yt-dlp https://www.youtube.com/watch?v=xxx — 直接下载 YouTube 视频报 ERROR: Sign in to confirm you're not a bot
✓ 正确:YouTube 对未登录的下载请求做了限制。解决方法:从浏览器导出 Cookies(用浏览器扩展如 Get cookies.txt),然后 yt-dlp --cookies cookies.txt URL。Bilibili 通常不需要 Cookies。
✏️ 动手练习
🟢 基础验证
请完成以下操作:① 用 curl 调用 http://httpbin.org/ip 获取你的公网 IP;② 用 jq 提取 .origin 字段;③ 用 dig +short github.com 查看 GitHub 的 IP 地址。
🟡 组合应用
编写一个一键天气查询脚本:用 curl 调用 wttr.in 的 JSON API(curl -s wttr.in/Beijing?format=j1),用 jq 提取当前温度和天气描述,格式化输出为"北京当前温度:XX°C,天气:XX"。提示:jq 表达式可以写成 jq -r '.current_condition[0] | "温度:\(.temp_C)°C,天气:\(.weatherDesc[0].value)"'。
🔴 开放挑战
构建一个 Termux 网络监控工具集:① 用 nmap 扫描你的局域网(如 192.168.1.0/24),发现所有在线设备;② 用 ping 检测云服务器和树莓派的连通性,记录延迟到日志文件;③ 用 curl + jq 定时调用一个公开 API(如天气或汇率),将结果追加到 CSV 文件中。要求:把三个功能封装成 shell 函数,通过参数选择执行哪个。提示:可以结合阶段四的 Termux:API 把结果推送到手机通知。
📖 知识回顾
curl 8.21.0 GET/POST 请求 wget 断点续传 递归下载 ping/traceroute/mtr dig DNS 查询 nmap 7.991 ss 端口查看 jq JSON 提取 yt-dlp 视频下载
下篇预告
12 网络代理与安全通信
将学习无 root 下的 SSH SOCKS5 代理、proxychains 代理链、以及配合 Android VPN App 的安全通信方案
关注 · 点赞 · 在看 · 分享