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 查看手册页。
关于
关注我获取更多资讯
📢 公众号
💬 个人号
本文链接地址:https://blog.eimoon.com/p/how-to-use-curl-download-files-guide/
作者:eimoon.com
分享转载说明:本文由作者原创,转载请注明出处。