0%

wget和curl的用法

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 步 (处理结果):
    1. 它会解析响应头中的 Content-Disposition 或 URL 的最后一部分,来决定文件名(file.zip)。
    2. 它会将响应体(文件内容)直接写入到这个文件中。
    3. 它会在终端显示详细的下载进度条、速度和预计剩余时间。
    4. 如果开启了递归模式 (-r),它会解析响应内容中的 HTML,寻找新的 URL,并对新 URL 重复整个流程。

常见用法

  • 下载大文件用 wgetwget -c (continue) 参数可以在下载中断后,从断点处继续下载。这对于大文件和不稳定的网络至关重要。
  • 后台下载用 wgetwget -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 步 (处理结果):
    1. 默认情况下,curl 会将整个响应体(文件内容或 HTML 源码)直接打印到标准输出(stdout),也就是你的屏幕上。
    2. 这使得 curl 可以非常方便地与管道符 | 结合,将数据流传递给下一个命令(如 jqgrep)进行处理。
    3. 你需要使用 -o 或 -O 选项来告诉 curl 将输出保存为文件。

常见用法

  • 调试 API 用 curlcurl -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 请求方法,如 POSTPUTDELETE
-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# -O (大写o): 将下载内容保存到你指定的文件名 archlinux.iso 中。如果不加,会保存为原始文件名。
wget -O archlinux.iso http://.../archlinux-2025.07.01-x86_64.iso

# -b (background): 将下载任务转到后台执行,你可以继续做别的事。
# -c (continue): 如果下载中断,下次执行相同命令会自动断点续传。这是下载大文件的黄金组合!
wget -bc http://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-desktop-amd64.iso


# --mirror: 开启“镜像”模式,是 -r -N -l inf --no-remove-listing 的缩写,会递归下载所有内容。
# -p (page-requisites): 下载所有页面元素,如 CSS, JS 和图片。
# -k (convert-links): 将页面中的链接转换为指向本地文件,方便离线浏览。
wget --mirror -p -k https://obsidian.liuvv.com/


# --limit-rate: 当你不想让下载任务占用全部带宽时,可以用它限速。这里限制为 500KB/s。
wget --limit-rate=500k http://.../large-file.zip


# 所有 URL 在 urls.txt 文件里,-i (input-file): 从一个文本文件中读取 URL 列表并依次下载,非常适合自动化脚本。
wget -i urls.txt

3.2 Curl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 1. 测试 API 接口是否通
# `-o /dev/null`: 将下载内容丢弃,我们只关心响应码。
# `-s` (silent): 静默模式,不显示进度条。
# `-w` (write-out): 按指定格式输出信息,`%{http_code}` 就是 HTTP 状态码(如 200, 404)。常用于健康检查脚本。
curl -o /dev/null -s -w "%{http_code}\n" http://api.myservice.com/health



# 2. 查看详细的通信过程
# -v (verbose): 显示全部通信过程,包括 DNS 解析、TCP 连接、SSL 握手信息和完整的 HTTP 请求/响应头。排查网络、证书、重定向问题的首选。
curl -v https://www.google.com


# 3. 发送 POST 请求
# -X POST: 指定请求方法为 POST。<br>-H "...": 添加一个 HTTP 请求头。这里是告诉服务器我发送的是 JSON 数据。
# -d '...': 指定要发送的数据体 (data)。
curl -X POST -H "Content-Type: application/json" -d '{"user":"botgem", "score":100}' http://api.example.com/submit

# 4. 自动跟踪重定向
# -L (Location): 当遇到 301/302 重定向时,curl 会自动跳转到新的 URL。访问短链接或很多登录页面时必须加它。
curl -L http://t.co/AABBCC

# 5. 下载文件并显示进度条
# -O (大写O): 使用服务器上的文件名来保存文件。
# -# 或 --progress-bar: 不显示详细的进度统计,只显示一个简洁的进度条 #。
curl -O -# https://.../file.zip


  • Curl -o 和 -O 的区别
1
2
3
4
5
6
7
-o, --output <file>
-O, --remote-name

# my-image.jpeg
curl -o my-image.jpeg https://example.com/assets/fsk48/picture.jpg
# picture.jpg (解析 URL 的最后一部分作为文件名,并将内容保存到该文件中。)
curl -O https://example.com/assets/fsk48/picture.jpg
  • 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
2
3
4
5
6
# 使用 curl
curl -X POST -H "Content-Type: application/json" -d '{"name":"BotGem", "rating":5}' https://api.example.com/reviews

# 使用 HTTPie
http POST https://api.example.com/reviews name=BotGem rating:=5

不过 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
可以加首页作者微信,咨询相关问题!