如何使用 cURL 下载文件:从基础到高级技巧

本文详细介绍了如何使用功能强大的命令行工具 cURL (Client URL) 进行文件下载。内容涵盖了从基础的文件获取、保存到本地,到处理HTTP重定向、使用认证(如基本认证和令牌认证)、设置超时与重试、实现断点续传,以及如何通过Shell脚本自动化下载任务。此外,文章还提供了常见问题排查指南,并对比了 cURL 与 wget 在不同场景下的适用性,旨在帮助开发者和系统管理员更高效地利用 cURL 进行网络通信和文件管理。

阅读时长: 5 分钟
共 2483字
作者: eimoon.com

cURL(Client URL)是一个广泛应用于系统间数据传输的库和命令行工具。它支持多种协议,并且通常在大多数类 Unix 操作系统中预装。由于其高度的可用性,curl 成为下载文件的理想选择,尤其是在服务器环境中。

本教程将指导您如何使用 curl 命令从 Web 服务器下载文件,涵盖文件内容查看、本地保存、处理重定向、处理认证、以及应对超时和中断下载等场景。这些技巧对于使用 REST API 或设置 Node.js 应用程序特别有用。

注意:从互联网下载文件可能存在风险。请务必确保从信誉良好的来源下载。本教程中,您将从 DigitalOcean 下载文件,且不会执行任何下载的文件。

1. 获取远程文件内容

在不带任何命令行参数的情况下,curl 命令会获取文件并将其内容直接显示到标准输出(stdout)。

示例:下载 DigitalOcean 的 robots.txt 文件并显示其内容:

curl https://www.digitalocean.com/robots.txt

输出将直接显示文件内容:

User-agent: *
Disallow:

sitemap: https://www.digitalocean.com/sitemap.xml
sitemap: https://www.digitalocean.com/community/main_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/questions_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/users_sitemap.xml.gz

2. 保存远程文件至本地

如果您想将远程文件保存到本地系统,并使用与服务器相同的原始文件名,可以使用 --remote-name 参数或其缩写 -O 选项。

示例

curl -O https://www.digitalocean.com/robots.txt

文件将开始下载,并在终端显示进度条,而不是文件内容。

3. 使用指定文件名保存远程文件

为了避免覆盖本地系统中可能存在的同名文件,您可以使用 -o--output 参数,后跟您希望保存内容的自定义文件名。

示例:将远程 robots.txt 文件下载并保存为 do-bots.txt

curl -o do-bots.txt https://www.digitalocean.com/robots.txt

4. 处理 HTTP 重定向

curl 默认不跟随重定向。如果文件已移动(例如,从 HTTP 重定向到 HTTPS),您可能无法获取到期望的内容。

您可以使用 -I 标志查看请求头,以确认是否存在重定向:

curl -I www.digitalocean.com/robots.txt

输出将显示 HTTP/1.1 301 Moved Permanently 以及 Location: https://www.digitalocean.com/robots.txt

要让 curl 自动跟随重定向,请使用 --location-L 参数:

curl -L www.digitalocean.com/robots.txt

您可以将 -L 参数与 -o-O 结合使用来下载重定向后的文件:

curl -L -o do-bots.txt www.digitalocean.com/robots.txt

警告:许多在线资源会要求您使用 curl 下载脚本并执行它们。在运行任何下载的脚本之前,最佳实践是先审查其内容,然后才使其可执行并运行。使用 less 命令审查代码,以确保它是您想要运行的内容。

5. 使用认证下载文件

curl 可以轻松处理需要认证的 Web 文件,这对于访问代理服务器或安全的 API 端点特别有用。

基本认证(用户名和密码)

使用 -u 标志提供登录凭据:

curl -u username:password -O https://example.com/securefile.zip

基于令牌的认证

通过 HTTP 头传递 API 令牌 (Token):

curl -H "Authorization: Bearer YOUR_TOKEN" -O https://api.example.com/protected/data.json

为提高安全性,请避免在代码中硬编码敏感数据,而是使用环境变量或配置文件。

6. 处理超时、重试与断点续传

健壮的脚本需要考虑网络中断和延迟。

断点续传(恢复中断的下载)

使用 -C - 选项可以从中断处恢复下载:

curl -C - -O https://example.com/largefile.iso

设置超时

为防止 curl 无限期挂起,使用 --max-time 设置最大允许时间(单位:秒):

curl --max-time 30 -O https://example.com/file.txt

重试失败的下载

使用 --retry 选项可以自动重试失败的下载,例如重试 3 次:

curl --retry 3 -O https://example.com/file.txt

7. 自动化下载:Shell 脚本应用

在 CI/CD 管道或定期备份中,自动化下载非常有用。这对于需要定期数据更新的 Node.js 应用程序或 REST API 尤其重要。

示例脚本

#!/bin/bash
URL="https://example.com/file.zip"
DEST="/home/user/downloads/file.zip"
curl -L -o "$DEST" "$URL"

使用 chmod +x script.sh 命令使脚本可执行,然后可以使用 cron 或在部署管道中安排它。

8. cURL 下载常见问题排查

有时下载可能会失败或行为异常。以下是一些常见问题及其解决方案:

文件未下载

如果 curl 未下载文件,请尝试以下故障排除步骤:

  • 使用 -I 检查服务器响应头。
  • 使用 -A "Mozilla/5.0" 模拟不同的用户代理 (User Agent)。
  • 使用 -v 启用详细输出,以检查 SSL/TLS 问题。
  • 如果 HTTPS 失败,尝试使用 HTTP 协议。
  • 如果文件受保护,请使用 -u username:password 提供凭据。

详细输出(-v)有助于识别问题根源:

curl -v -O https://example.com/file.zip

9. wgetcurl 的替代方案与对比

虽然 curl 功能强大,但在某些下载场景中 wget 可能更合适。wget 专门设计用于下载文件,并具有一些特别有用的功能。

基本 wget 用法

下载文件:

wget https://example.com/file.zip

wget 的关键功能

  • 自动重试wget -t 3 https://example.com/file.zip
  • 后台下载wget -b https://example.com/file.zip
  • 限制下载速度wget --limit-rate=200k https://example.com/file.zip
  • 下载整个网站wget --mirror --convert-links --adjust-extension --page-requisites --no-parent https://example.com

何时选择 wget 而非 curl

  • 需要递归下载时。
  • 镜像整个网站时。
  • 需要内置的自动重试功能时。
  • 寻求更简单的下载命令时(wget 选项相对较少)。

何时坚持使用 curl

  • 需要与 REST API 交互时。
  • 进行更复杂的 HTTP 请求时(例如,发送 POST 请求、自定义请求头)。
  • 需要向服务器发送数据时。
  • 为了更好的脚本集成和更细粒度的控制。

常见问题解答 (FAQ)

1. curl 中的 -O-o 有什么区别?

  • -O (大写字母 “O”):将下载的文件保存为服务器提供的原始文件名。
  • -o (小写字母 “o”):允许您为下载的文件指定一个自定义的文件名。

2. 如何使用 curl 恢复中断的下载?

使用 -C - 选项。这会告诉 curl 从上次中断的地方继续下载,前提是服务器支持 HTTP 范围请求 (HTTP Range Requests)。

3. 可以使用 curl 下载需要认证的文件吗?

可以。

  • 基本认证:curl -u username:password -O https://secure.example.com/file.zip
  • 基于令牌的认证:curl -H "Authorization: Bearer YOUR_TOKEN" -O https://api.example.com/file.zip 请避免在代码中硬编码敏感凭据。

4. 如果下载 URL 重定向怎么办?

使用 -L--location 选项,curl 将跟随重定向到新的位置。

5. cURL 在 Windows 上可用吗?

是的,cURL 在 Windows 10 及更高版本中默认包含。您也可以通过 Git Bash、Cygwin 或 Chocolatey (choco install curl) 安装。

6. 如何使用 curl 同时下载多个文件?

可以通过列出多个 URL,或者使用大括号扩展来下载一系列文件:

  • 多个 URL: curl -O https://example.com/file1.zip -O https://example.com/file2.zip
  • 大括号扩展: curl -O https://example.com/file{1..5}.zip 您还可以使用包含 URL 列表的文本文件和 -K 选项。

7. 如何处理 curl 中的 SSL/TLS 证书问题?

不推荐用于生产环境,但可以使用 -k--insecure 选项绕过证书验证。更安全的方法是使用 --cacert /path/to/certificate.pem 指定自定义证书。

8. 如何使用 curl 监控下载进度和速度?

curl 默认会显示进度条。您可以使用 -# 显示一个简单的进度条,或者使用 -w 选项和各种变量(如 %{speed_download}%{time_total})创建自定义进度格式。

总结

curl 是一个功能强大且灵活的命令行工具,可以帮助您快速从远程系统下载文件。它支持多种协议,使其成为文件传输的可靠且脚本友好的选择。从简单的下载到复杂的 API 交互,curl 能够处理自定义头部、认证、重定向和可恢复下载等所有操作。它是开发人员、系统管理员和 DevOps 工程师的必备工具,因为它可以在不依赖重量级工具的情况下精确控制网络通信。

无论您是在 CI/CD 管道中自动化任务,集成来自外部源的数据,还是测试 REST API 或 Node.js 应用程序中的端点,curl 都能自然地融入现代开发工作流程。

要深入了解其所有功能,请运行 man curl 查看手册页。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计