第64课:curl 与 wget 文件传输
学习目标
完成本课学习后,你将能够:
- 理解
curl和wget两个命令行工具的核心区别与适用场景。 - 使用
wget从网络下载文件、网页并保存到本地。 - 使用
curl发送 HTTP 请求并处理响应内容。 - 掌握
-O(大写)、-o(小写)、-s(静默)等常用参数的用法。 - 组合使用
curl或wget与其他命令(如重定向、管道)完成基本的运维任务。
核心概念
在 Linux 系统管理中,从命令行下载文件或与 Web 服务交互是极其常见的操作。curl 和 wget 是完成这些任务的两大“神器”,但它们的设计哲学和侧重点不同。
1. wget:专注的下载工具
想象 wget 是一个专业的“文件搬运工”。它的主要任务是下载,特别是递归下载整个网站或FTP站点。它非常可靠,支持断点续传,并且下载过程中如果中断,可以从断点继续。
- 核心功能:从 HTTP、HTTPS、FTP 服务器下载文件。
- 特色:递归下载(
-r)、断点续传(-c)、后台下载(-b)。 - 简单比喻:
wget像一个专注于“存取”文件的快递员。
2. curl:全能的传输瑞士军刀
curl 则更像一个功能强大的“通信工具”。它不仅能下载文件,更能发送各种类型的 HTTP 请求(GET, POST, PUT, DELETE等),模拟表单提交,调试API,并直接查看服务器的原始响应。
- 核心功能:与服务器进行数据传输和交互。
- 特色:支持海量协议(HTTP, FTP, SCP, SMTP等)、强大的请求定制能力(添加请求头、发送POST数据)。
- 简单比喻:
curl是一个精通各种语言的“通信专家”,既能接收信息,也能发送指令。
常用参数速查表
- 共同参数:
-O(大写字母O):将下载的文件保存为与远程服务器上相同的文件名。-o <文件名>(小写字母o):将下载的内容保存到指定的文件名中。-s或--silent:静默模式,不显示进度条和错误信息(常用于脚本)。-k或--insecure:允许不安全的 SSL 连接(如连接自签名证书的 HTTPS 服务器)。
wget专属:-c(继续下载),-r(递归下载),-b(后台下载)。curl专属:-X(指定请求方法),-H(添加请求头),-d(发送POST数据)。
代码示例
示例1:使用 wget 下载文件
# 1. 最简单的下载,文件保存在当前目录
wget https://example.com/image.jpg
# 2. 使用 -O 指定保存的文件名
wget -O my_website.html https://example.com
# 3. 断点续传一个大文件
wget -c https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso
# 4. 静默模式下载(适用于脚本)
wget -q -O /tmp/config.backup https://example.com/config.cfg
示例2:使用 curl 获取网页内容
# 1. 将网页内容直接输出到终端(标准输出)
curl https://example.com
# 2. 使用 -o 将网页内容保存到文件
curl -o example.html https://example.com
# 3. 使用 -O 以原始文件名保存(对于直接指向文件的URL有效)
curl -O https://example.com/data/report.pdf
# 4. 发送一个 GET 请求并查看响应头信息(使用 -I 或 --head 仅获取头信息)
curl -I https://api.github.com
示例3:使用 curl 发送 POST 请求(模拟API调用)
# 向一个测试API发送POST数据,并以JSON格式显示响应(-s静默,-S在出错时显示错误,-p美化JSON输出需配合jq)
curl -s -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{"title": "运维笔记", "body": "curl很好用", "userId": 1}' | python3 -m json.tool
# 注意:上面的命令使用了 `python3 -m json.tool` 来美化JSON输出。如果没有Python,也可以安装jq工具来实现。
# 一个更简单的例子,不使用JSON美化
curl -X POST https://postman-echo.com/post \
-d "param1=value1¶m2=value2"
示例4:组合使用与重定向
# 使用 curl 获取内容,然后通过 grep 筛选特定信息
curl -s https://api.github.com/repos/torvalds/linux | grep '"full_name"'
# 使用 wget 下载,并用 tar 解压(假设URL指向一个tar.gz压缩包)
wget -qO- https://github.com/example/project/archive/main.tar.gz | tar xz
实践练习
练习1:基础下载
请分别使用 wget 和 curl 下载 http://example.com 的首页内容,并分别保存为 wget_index.html 和 curl_index.html。
- 要求:使用
-O或-o参数指定文件名。 - 预期结果:当前目录下生成两个内容相同的 HTML 文件。
练习2:高级应用
假设你需要监控一个网站的状态。请编写一条 curl 命令,它静默地(不显示进度)获取 https://httpbin.org/status/200 的HTTP状态码,并将该状态码输出到屏幕上。
- 提示:你需要组合使用
-s(静默),-o /dev/null(丢弃响应体),和-w "%{http_code}\n"(自定义输出格式,这里只输出状态码并换行)。 - 预期输出:
200
练习3:场景实战
你有一个配置文件的URL:https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore。请完成以下任务:
- 将该文件下载并保存为
my_python.gitignore。 - 使用一条命令,下载该文件内容并直接搜索其中是否包含
__pycache__这个字符串,如果包含则输出 “Found: pycache”,否则输出 “Not Found”。
- 预期输出(针对第2小问):
Found: __pycache__(因为原始文件确实包含它)。
常见错误
- 忘记保存文件:直接运行
curl https://example.com/file.zip会在终端输出乱码(二进制文件内容),而不是保存文件。正确做法:始终使用-O或-o参数来保存文件。 - 混淆大小写的
-o和-O:-o需要你指定一个文件名(-o filename),而-O会自动使用服务器端的文件名。用错会导致文件被保存为O或覆盖错误文件。 - 忽略错误和静默模式:在编写脚本时,如果不使用静默模式 (
-s),curl和wget的进度和日志信息会干扰脚本的输出。但同时也应考虑错误处理,例如curl的-S(大写) 可以在静默模式下仍然显示错误。 wget递归下载的误解:初学者可能误用wget -r http://site.com导致下载整个网站的所有页面和资源,占用大量空间。请务必明确你递归下载的范围和深度(使用-l参数)。- HTTPS证书错误:访问自签名或配置不当的HTTPS网站时,
curl和wget会报错。虽然可以使用-k或--no-check-certificate跳过验证,但这不安全,仅应在测试或可信环境中使用。
小结
wget是下载专家,尤其擅长可靠、可恢复的文件下载和批量抓取。curl是交互专家,功能全面,特别适合发送自定义请求、调试API和获取服务器响应的详细信息。- 保存文件是基本操作,务必牢记
-O(用原名) 和-o <文件名>(自定义名) 的区别。 - 静默模式 (
-s) 在脚本中非常有用,能让输出更干净。 - 两者在运维中都不可或缺。简单下载任务可首选
wget,需要与API交互或进行复杂请求时则用curl。
练习编辑器
rust
Loading...