64·网络入门

curl 与 wget 文件传输

curlwget

第64课:curl 与 wget 文件传输

学习目标

完成本课学习后,你将能够:

  1. 理解 curlwget 两个命令行工具的核心区别与适用场景。
  2. 使用 wget 从网络下载文件、网页并保存到本地。
  3. 使用 curl 发送 HTTP 请求并处理响应内容。
  4. 掌握 -O(大写)、-o(小写)、-s(静默)等常用参数的用法。
  5. 组合使用 curlwget 与其他命令(如重定向、管道)完成基本的运维任务。

核心概念

在 Linux 系统管理中,从命令行下载文件或与 Web 服务交互是极其常见的操作。curlwget 是完成这些任务的两大“神器”,但它们的设计哲学和侧重点不同。

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&param2=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:基础下载 请分别使用 wgetcurl 下载 http://example.com 的首页内容,并分别保存为 wget_index.htmlcurl_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。请完成以下任务:

  1. 将该文件下载并保存为 my_python.gitignore
  2. 使用一条命令,下载该文件内容并直接搜索其中是否包含 __pycache__ 这个字符串,如果包含则输出 “Found: pycache”,否则输出 “Not Found”。
  • 预期输出(针对第2小问):Found: __pycache__ (因为原始文件确实包含它)。

常见错误

  1. 忘记保存文件:直接运行 curl https://example.com/file.zip 会在终端输出乱码(二进制文件内容),而不是保存文件。正确做法:始终使用 -O-o 参数来保存文件。
  2. 混淆大小写的-o-O-o 需要你指定一个文件名(-o filename),而 -O 会自动使用服务器端的文件名。用错会导致文件被保存为 O 或覆盖错误文件。
  3. 忽略错误和静默模式:在编写脚本时,如果不使用静默模式 (-s),curlwget 的进度和日志信息会干扰脚本的输出。但同时也应考虑错误处理,例如 curl-S (大写) 可以在静默模式下仍然显示错误。
  4. wget 递归下载的误解:初学者可能误用 wget -r http://site.com 导致下载整个网站的所有页面和资源,占用大量空间。请务必明确你递归下载的范围和深度(使用 -l 参数)。
  5. HTTPS证书错误:访问自签名或配置不当的HTTPS网站时,curlwget 会报错。虽然可以使用 -k--no-check-certificate 跳过验证,但这不安全,仅应在测试或可信环境中使用。

小结

  • wget下载专家,尤其擅长可靠、可恢复的文件下载和批量抓取。
  • curl交互专家,功能全面,特别适合发送自定义请求、调试API和获取服务器响应的详细信息。
  • 保存文件是基本操作,务必牢记 -O (用原名) 和 -o <文件名> (自定义名) 的区别。
  • 静默模式 (-s) 在脚本中非常有用,能让输出更干净。
  • 两者在运维中都不可或缺。简单下载任务可首选 wget,需要与API交互或进行复杂请求时则用 curl

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「DNS 解析与配置」 以巩固所学知识。