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. wget
:curl
的替代方案与对比
虽然 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
查看手册页。
关于
关注我获取更多资讯

