Linux curl 与 wget 区别
curl
和 wget
都是 Linux/Unix 系统中用于处理网络请求的强大命令行工具,它们的功能有重叠,但设计哲学和主要用途有显著区别。
简单来说,可以这样概括:
curl
:更像一个精细的瑞士军刀,侧重于与网络服务器进行交互和传输数据,尤其擅长 API 调用和脚本集成。wget
:更像一个强力的下载工具,侧重于递归下载文件和镜像网站,尤其擅长离线浏览和批量下载。
下面我们从多个维度进行详细对比。
核心区别对比表
特性 | curl | wget |
---|---|---|
设计哲学 | 传输数据,与服务器交互 | 下载文件,递归抓取 |
协议支持 | 极其广泛 (DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMTP, SMTPS, Telnet, TFTP等) | 主要网络协议 (HTTP, HTTPS, FTP) |
输出默认行为 | 将输出内容打印到标准输出(stdout) | 直接将文件下载到当前目录 |
递归下载 | 不支持 原生递归下载目录或整个网站 | 原生支持 (-r 选项),可以镜像网站 |
交互性与脚本 | 极佳。易于在管道中使用,能轻松处理 cookie、认证、头部信息,是调用 REST API 的首选。 | 较弱。更偏向于独立的下载任务。 |
后台下载 | 不支持(需借助 nohup 或 & ) | 支持 (-b 选项),可以在后台继续下载 |
断点续传 | 支持 (-C - ) | 支持 (-c ) |
发行版普及 | 通常预装在大多数系统中 | 也几乎都预装,但在一些极简 Docker 镜像中可能没有 |
License | MIT 许可证 | GPL 许可证 |
详细解释与使用场景
1. curl - 数据传输的“万能胶水”
curl
的核心优势在于其灵活性和与其它命令协作的能力。
主要特点:
输出到标准输出:默认情况下,
curl URL
会将下载的内容直接打印在终端上。这让你可以轻松地通过管道 (|
) 传递给其他工具如grep
,jq
,less
等进行处理。curl -s "https://api.github.com/users/octocat" | jq '.login'
强大的协议支持:几乎支持所有你能想到的与数据传输相关的协议。
精细的控制:可以非常方便地设置 HTTP 头、方法、发送表单数据、处理 Cookie、进行认证等。
# 发送 POST 请求 with JSON 数据 curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/endpoint# 使用 Cookie curl -b "name=value" https://example.com# 设置自定义 User-Agent curl -A "MyCustomAgent" https://example.com
库支持:
curl
背后是libcurl
库,许多编程语言(如 PHP, Python, C++)都使用这个库来进行网络编程。
典型使用场景:
测试和调试 RESTful API。
在 Shell 脚本中与 Web 服务进行交互。
快速检查某个 URL 的响应头或状态码。
上传或下载文件,尤其是需要复杂认证或设置的情况。
2. wget - 可靠的“下载器”
wget
的核心优势在于其简单直接和强大的下载能力,特别是递归下载。
主要特点:
输出到文件:默认情况下,
wget URL
会直接把文件下载到当前目录,并以原文件名保存。这更符合“下载”的直觉。递归下载:这是
wget
的杀手锏。可以下载整个网站或目录结构,用于离线浏览或备份。# 递归下载网站,只抓取 html 文件,并转换为本地链接 wget -r -l 2 -k -p -A html https://example.com/docs/
后台和断点续传:内置支持后台运行 (
-b
) 和断点续传 (-c
),对于下载大文件非常友好。# 断点续传一个大文件 wget -c https://example.com/bigfile.iso# 后台下载 wget -b https://example.com/bigfile.iso
鲁棒性:在网络连接不稳定时,
wget
会持续重试,直到文件下载完成或超过重试次数。
典型使用场景:
从网络上下载单个大文件。
镜像整个网站 以供离线查看。
通过 FTP 递归下载整个目录。
在脚本中执行简单的“下载并保存”任务。
如何选择?
当你需要与 Web API 交互、测试服务器、在管道中处理数据时,使用
curl
。例子:
curl -s "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd"
当你只是想下载一个文件(尤其是大文件)或者递归下载整个目录/网站时,使用
wget
。例子:
wget -m -k -p https://docs.example.com/
在 Shell 脚本中:
如果需要处理响应内容(如解析 JSON),用
curl
。如果只是简单地“下载这个文件到磁盘”,两者都可以,但
wget
的默认行为更直接。
总结
工具 | 优势 | 劣势 |
---|---|---|
curl | 协议支持广、脚本友好、交互性强、功能精细 | 不支持递归下载、默认不直接保存文件 |
wget | 递归下载能力强、默认行为简单、支持后台下载、鲁棒性好 | 协议支持较少、脚本集成不如 curl 灵活 |
简单记忆:
想“玩”网络服务,用 curl
;想“搬”网站文件,用 wget
。
两者都是不可或缺的工具,一个专业的 Linux 用户通常会根据具体场景灵活选用两者。