装完系统第一件事往往是拉个文件。wget、curl、aria2c 都能干这事,但用错了会白等半小时:抓整站拿 curl 手搓循环,或者下 4K 镜像只开一个连接。
先给结论:
| 场景 | 用哪个 |
|---|---|
| 下一个普通文件 | wget 或 curl -LO |
| 调接口、看响应头、发 JSON | curl |
| 镜像整站、离线文档 | wget |
| 大文件、跨境慢速链路 | aria2c -x 16 -s 16 |
| 按列表批量下、要限并发 | aria2c -i urls.txt |
| BT 种子 / 磁力链 | aria2c |
wget:稳,适合抓站
wget 的定位是”无人值守地下载”。断线自动重试,递归抓取,几乎每个发行版都预装。
# 下载,保存为同名文件
wget https://example.com/file.tar.gz
# 指定名字、指定目录
wget -O rust.tar.gz https://example.com/file
wget -P ./downloads https://example.com/a.zip
# 断点续传:大文件被中断后接着下
wget -c https://example.com/big.iso
# 批量下载,一行一个 URL
wget -i urls.txt -P ./downloads
# 限速 2MB/s,超时 10s,失败重试 3 次
wget --limit-rate=2m --timeout=10 --tries=3 -c https://example.com/big.iso
# 丢后台跑,日志写到 wget-log
wget -b -c https://example.com/big.iso
# 证书有问题时临时跳过校验
wget --no-check-certificate https://example.com/file
抓整站是它最不可替代的地方:
# 镜像站点:递归 + 不爬上级目录 + 转换链接 + 下载页面所需资源
wget -m -np -k -p https://docs.example.com/
# 只抓某一层,避免被索引页拖进无限循环
wget -r -l 2 -np -k -E https://docs.example.com/
-m 等价于 -r -N -l inf --no-remove-listing,-k 把页面里的链接改成本地路径,-p 连图片、CSS、JS 一起拉。没有 -np 很容易从子页面爬回根目录再爬一遍。
curl:不只是下载
curl 真正的价值在 HTTP 调试。下载只是顺手能做的事,更细的用法我另写过一篇(curl 实战速查),这里只留下载相关的。
# 下载,自动用远端文件名
curl -LO https://example.com/file.zip
# 跳转链接必须加 -L,否则存下来的是 302 页面
curl -L -o out.zip https://example.com/download?id=123
# 断点续传
curl -C - -O https://example.com/big.iso
# 静默下载 + 失败重试(-sS 静默但保留报错)
curl -sS --retry 3 --retry-delay 2 -C - -O https://example.com/big.iso
# 限速、走代理
curl --limit-rate 2M -O https://example.com/big.iso
curl -x http://127.0.0.1:7890 -O https://example.com/big.iso
接口调试才是主场:
# 只看状态码
curl -s -o /dev/null -w '%{http_code}\n' https://example.com
# 带 Token 发 JSON
curl -X POST https://api.example.com/v1/items \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"name":"test"}'
# 上传文件
curl -F 'file=@archive.zip' https://api.example.com/upload
curl 7.66 之后支持 -Z 并行拉多个 URL,但它是”多文件并发”,不是”单文件多连接”,单文件加速还是得靠 aria2。
curl -Z -O https://example.com/a.zip -O https://example.com/b.zip
aria2c:大文件和多来源
aria2c 的卖点是单文件多连接、多协议(HTTP/HTTPS/FTP/SFTP/BT/Metalink),以及一个能挂远程控制的 RPC。
# 16 个连接切同一文件,每块最小 1M
aria2c -x 16 -s 16 -k 1M https://example.com/big.iso
# 断点续传 + 指定目录和文件名
aria2c -c -x 16 -s 16 -d ~/Downloads -o ubuntu.iso https://example.com/ubuntu.iso
# 从列表批量下,同时最多 5 个任务
aria2c -i urls.txt -j 5 -x 16 -s 16
# 限速、最多试 5 次、间隔 3 秒
aria2c --limit-rate=2M --max-tries=5 --retry-wait=3 -c https://example.com/big.iso
# 证书不受信时
aria2c --check-certificate=false https://example.com/file
BT 和磁力链直接喂给它:
aria2c file.torrent
aria2c 'magnet:?xt=urn:btih:xxxxxxxx'
aria2c --seed-time=0 'magnet:?...' # 下完不做种
需要长期挂着下载时,开 RPC,用 AriaNg 之类的网页前端管任务:
aria2c --enable-rpc --rpc-listen-all=false --rpc-listen-port=6800 \
--rpc-secret=your-token --save-session=/tmp/aria2.session
--save-session 配合 -i 能把没下完的任务在重启后接上,比手工记 URL 靠谱。
对比
| 维度 | wget | curl | aria2c |
|---|---|---|---|
| 单文件多连接 | 不支持 | 不支持 | 支持(-x / -s) |
| 断点续传 | -c | -C - | -c |
| 递归 / 镜像 | 支持(-m、-r) | 不支持 | 不支持 |
| 批量列表 | -i | 多 URL 或 -Z 并行 | -i + -j 控并发 |
| HTTP 调试 | 弱 | 强 | 基本没有 |
| BT / 磁力 | 不支持 | 不支持 | 支持 |
| 远程控制 | 无 | 无 | JSON-RPC + Web UI |
| 装上就能用 | 是 | 是 | 需另装 |
几个坑
curl -O 忘了 -L。跳转链接会把 302 响应体存成文件,打开一看是几行 HTML。
aria2 的 -x 不是越大越好。单服务器上限 16,很多站点反而会因为你并发过高返回 403/429。遇到这种情况降到 -x 4 再试。
磁盘空间被预占。aria2 默认预分配文件空间,小磁盘或网络文件系统上可能直接卡住,加 --file-allocation=none。
断点续传要看服务器脸色。-c、-C - 都依赖服务端支持 Range。如果日志里显示从 0 重新开始,那就是服务端没给 206。
RPC 别裸奔。--rpc-listen-all 且没有 --rpc-secret,等于把下载器交给整个局域网。
收尾
日常下一个文件,wget -c 够用;要调接口或者拼请求,curl 更顺手;碰上大文件慢链路,或者一次几十个 URL,直接上 aria2c。三个都装着不冲突,按场景换就行。
