wget (全称: Web Get): 它的核心使命是下载文件。它是一个纯粹、专注且可靠的下载器,尤其擅长处理大文件和递归下载(比如整个网站)。wget 就像一个专业的网络快递员。你给他一个或多个收货地址(URL),他的任务就是把包裹(文件)完整无误地送到你指定的地点(本地硬盘),如果中途失败了还会自动重试。他很专注,只会送货。
curl (全称: Client for URLs): 它的核心使命是传输数据。它是一个功能极其强大的“全能工具”,可以让你通过 URL 与各种网络服务进行数据交互。下载只是它的众多功能之一,它还能上传、发送表单、测试 API 等。curl 就像一位全能的特工/侦察兵。他不仅可以取回情报(下载文件),还能向目标发送信息(POST 上传数据)、进行伪装(修改 User Agent)、检查目标的防御工事(查看 HTTP 头部信息),甚至还能使用各种秘密通道(支持 FTP, SCP, LDAP 等多种协议)。他 versatile(多才多艺),重在交互。
wget 主要支持 HTTP, HTTPS, FTP 。curl 支持的极其广泛 (HTTP/S, FTP/S, SCP, IMAP, POP3, SMB, LDAP…)
1. Wget
流程
[你输入命令] -> [1. 解析 URL] -> [2. DNS 查询 IP] -> [3. 建立 TCP 连接] -> [4. 发送 HTTP 请求] -> [5. 接收 HTTP 响应] -> [6. 处理结果]
wget
的处理方式(以 wget http://example.com/file.zip
为例):
- 第 4 步 (发送请求):
wget
会像浏览器一样,发送一个标准的GET
请求,并带上自己的User-Agent
(例如Wget/1.21.2
)。 - 第 6 步 (处理结果):
- 它会解析响应头中的
Content-Disposition
或 URL 的最后一部分,来决定文件名(file.zip
)。 - 它会将响应体(文件内容)直接写入到这个文件中。
- 它会在终端显示详细的下载进度条、速度和预计剩余时间。
- 如果开启了递归模式 (
-r
),它会解析响应内容中的 HTML,寻找新的 URL,并对新 URL 重复整个流程。
- 它会解析响应头中的
常见用法
- 下载大文件用
wget
:wget -c
(continue) 参数可以在下载中断后,从断点处继续下载。这对于大文件和不稳定的网络至关重要。 - 后台下载用
wget
:wget -b
(background) 可以让下载任务在后台执行,你可以关闭当前终端窗口而不影响下载。
2. Curl
libcurl
的力量: curl
命令本身只是 libcurl
这个库的一个“客户端”。libcurl
是一个免费、开源的客户端 URL 传输库,被用在无数的应用程序中,包括你的手机 App、汽车、智能电视、Git、PHP,甚至火星探测器!所以你学习 curl
,其实是在学习一个无处不在的技术的核心交互方式。
流程
[你输入命令] -> [1. 解析 URL] -> [2. DNS 查询 IP] -> [3. 建立 TCP 连接] -> [4. 发送 HTTP 请求] -> [5. 接收 HTTP 响应] -> [6. 处理结果]
curl
的处理方式(以 curl http://example.com/file.zip
为例):
- 第 4 步 (发送请求):
curl
同样发送GET
请求,但它极其灵活,你可以用-X POST
发送不同类型的请求,用-H "Header: Value"
添加任意请求头。 - 第 6 步 (处理结果):
- 默认情况下,
curl
会将整个响应体(文件内容或 HTML 源码)直接打印到标准输出(stdout
),也就是你的屏幕上。 - 这使得
curl
可以非常方便地与管道符|
结合,将数据流传递给下一个命令(如jq
,grep
)进行处理。 - 你需要使用
-o
或-O
选项来告诉curl
将输出保存为文件。
- 默认情况下,
常见用法
- 调试 API 用
curl
:curl -v
(verbose) 或curl -i
(include headers) 可以显示详细的请求和响应信息,是调试接口的利器。 - 处理重定向:很多网址会使用 301/302 重定向。
curl
需要加-L
(location) 才会自动跳转到最终地址,而wget
默认就会跟踪重定向。不确定是否会重定向时,习惯性地加上-L
- 软件一键安装脚本: 你一定见过类似
curl -fsSL https://get.docker.com | sudo bash
的命令。它用curl
下载安装脚本,然后通过管道直接交给bash
执行。(安全警告:只对你完全信任的来源使用这种方法!)
常见选项
1. 输出与显示 (Output & Display)
选项 | 长格式 | 用途 |
---|---|---|
-o <file> | --output <file> | 将输出保存到指定文件。 |
-O | --remote-name | 使用 URL 中的文件名保存。 |
-i | --include | 在输出内容中包含 HTTP 响应头。 |
-I | --head | 只获取 HTTP 响应头(等同于发 HEAD 请求)。 |
-s | --silent | 静默模式。不显示进度条和错误信息。脚本必备! |
-S | --show-error | 配合 -s 使用,静默模式下仍然显示错误信息。 |
-w <fmt> | --write-out <fmt> | 在请求完成后,按指定格式输出信息。(技巧部分详述) |
2. 请求构建 (Request Building)
选项 | 长格式 | 用途 |
---|---|---|
-X <METHOD> | --request <METHOD> | 指定 HTTP 请求方法,如 POST , PUT , DELETE 。 |
-H <header> | --header <header> | 添加自定义请求头,如 -H "Content-Type: application/json" 。 |
-d <data> | --data <data> | 发送 POST 请求的数据体,Content-Type 默认为 application/x-www-form-urlencoded 。 |
-F <form> | --form <form> | 发送 multipart/form-data 数据,常用于文件上传。-F "file=@/path/to/file.txt" |
-G | --get | 让 -d 的数据以 GET 请求的 URL 参数形式发送。 |
-e <URL> | --referer <URL> | 设置 Referer 请求头,模拟从某个页面跳转过来。 |
-A <string> | --user-agent <string> | 设置 User-Agent 请求头,伪装成特定浏览器。 |
3. 网络与连接 (Network & Connection)
选项 | 长格式 | 用途 |
---|---|---|
-L | --location | 自动跟踪 301/302 重定向。 |
--connect-timeout <sec> | 设置建立连接的超时时间(秒)。 | |
--max-time <sec> | 设置整个操作(连接 + 传输)的最大允许时间。 | |
-x <proxy> | --proxy <proxy> | 使用 HTTP/S 代理,如 -x http://user:pass@proxy.host:port 。 |
--resolve <host:port:ip> | [运维利器] 强制将某个域名解析到指定的 IP 地址,用于测试、灰度发布验证等。 | |
--unix-socket <path> | [运维利器] 通过 Unix Socket 与服务通信,常用于 Docker。 |
4. 安全与认证 (Security & Authentication)
选项 | 长格式 | 用途 |
---|---|---|
-u <user:pass> | --user <user:pass> | 发送 HTTP Basic Auth 认证。 |
-k | --insecure | [慎用] 忽略 SSL/TLS 证书验证。仅用于内部测试或你确切知道目标是谁。 |
--cacert <file> | 指定一个 CA 证书文件,用于验证服务器证书(常用于自签名证书场景)。 | |
-E <file> | --cert <file> | 指定客户端证书文件(常用于双向 TLS 认证)。 |
3. 场景比较
3.1 Wget
1 | # -O (大写o): 将下载内容保存到你指定的文件名 archlinux.iso 中。如果不加,会保存为原始文件名。 |
3.2 Curl
1 | # 1. 测试 API 接口是否通 |
- Curl -o 和 -O 的区别
1 | -o, --output <file> |
- Curl 调试的技巧
- 熟练运用
-v
(verbose) 查看完整的请求和响应头,这是 API 调试的第一步。 - 知道
-i
(include headers) 和-I
(HEAD request) 的区别和用途。 - 会用
-o /dev/null
来丢弃响应体,只关心请求的成功与否或响应头。
- 熟练运用
4. 提问问题
Wget 是不是可以完全被 curl 替代
在下载的核心领域,wget 仍然是最佳选择,不应该被 curl 完全替代。
wget --mirror http://site.com
可以克隆整个网站,自动解析 HTML 并下载所有资源。
curl
不会解析 HTML 来发现并下载页面内的其他链接。
当你需要像浏览器一样“下载并保存”一个或一堆文件,尤其是需要整站下载或保证大文件下载的稳定性时,请毫不犹豫地使用 wget
。在其他所有需要与 URL 进行数据交互的场景(特别是 API 测试和脚本自动化),curl
都是王者。
HTTPie 是什么
1 | # 使用 curl |
不过 HTTPie 功能不如 curl
全面(如协议支持少)。
curl 是一个经过数十年考验的、极其稳定的工具。它的行为是可预测的。HTTPie 的美化输出(如颜色代码)对于脚本来说是灾难,会污染数据。脚本需要的是 curl 那样纯粹、原始的输出,以便用 grep, awk, jq 去解析。
Curl -vvv 什么意思
-v (或 –verbose): 开启啰嗦模式 (Verbose Mode)。这是最常用的调试开关。
-vv: 更啰嗦。在 -v 的基础上,会增加更多特定协议的细节。
-vvv: 最啰嗦。在 -vv 的基础上,提供更详尽的信息,例如在 SSL/TLS 握手过程中每一条消息的细节。
解决棘手的网络问题:当你怀疑是防火墙问题、SSL 证书配置错误、TLS 版本不兼容等深层次问题时,curl -vvv 就能提供海量线索,让你看到最底层的通信细节。
5. 总结
- curl 没事就 -L,下载 -O