curl 下载文件:从入门到精通,直接查看结果 – wiki大全


curl 下载文件:从入门到精通

curl 是一个功能强大的命令行工具,用于传输数据,支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、LDAP、LDAPS、DICT、TELNET、FILE、IMAP、POP3、SMTP、RTSP 和 RTMP。对于开发者、系统管理员和任何需要从命令行下载文件的人来说,它都是一个不可或缺的工具。

本文将从基础开始,逐步深入 curl 的下载功能,助您从入门到精通。

入门:最基本的下载

1. 直接下载文件并显示到标准输出 (stdout)

最简单的 curl 命令会将文件内容直接打印到您的终端屏幕上。这对于查看小型文本文件或 API 响应非常有用。

bash
curl https://example.com/somefile.txt

2. 下载文件并保存为原始文件名 (-O)

如果您想下载一个文件并将其保存到当前目录,文件名与远程服务器上的原始文件名相同,可以使用 -O(大写 O)选项。

bash
curl -O https://example.com/path/to/my_document.pdf

这会将 my_document.pdf 下载到您运行命令的当前目录。

3. 下载文件并指定本地文件名 (-o)

如果您想将下载的文件保存为不同的文件名,或者保存到特定目录,可以使用 -o(小写 o)选项,后面跟您希望保存的文件路径和名称。

bash
curl -o local_name.pdf https://example.com/path/to/my_document.pdf

或者保存到指定目录:

bash
curl -o /home/user/downloads/report.zip https://example.com/data/latest_report.zip

进阶:更高级的下载技巧

1. 断点续传 (-C -)

网络连接不稳定时,文件下载中断是常有的事。curl 的断点续传功能可以从上次中断的地方继续下载,避免从头开始。使用 -C - 选项即可。

bash
curl -C - -O https://example.com/large_file.iso

如果 large_file.iso 已经部分下载,curl 会自动检测本地文件大小,并请求服务器从缺失的部分开始传输。

2. 下载多个文件

curl 可以通过单个命令下载多个文件,但通常需要每个文件单独指定 -O-o

bash
curl -O https://example.com/file1.txt -O https://example.com/file2.zip

或者使用 xargs 结合循环来处理列表:

bash
cat file_list.txt | xargs -n 1 curl -O

其中 file_list.txt 包含每行一个 URL。

3. 处理重定向 (-L)

许多网站会使用 HTTP 重定向(例如从 HTTP 到 HTTPS,或从旧 URL 到新 URL)。默认情况下,curl 不会跟随重定向。使用 -L 选项可以指示 curl 自动跟随服务器发出的所有重定向。

bash
curl -L -O http://old-domain.com/new-resource.zip

4. 认证 (-u)

如果需要从受密码保护的资源下载文件,可以使用 -u 选项提供用户名和密码。

  • 基本认证 (Basic Authentication):
    bash
    curl -u username:password -O https://example.com/protected/document.docx

    您也可以只提供用户名,curl 会在运行时提示您输入密码:
    bash
    curl -u username -O https://example.com/protected/document.docx

  • Digest 认证: 对于使用 Digest 认证的服务器,添加 --digest 选项:
    bash
    curl --digest -u username:password -O https://example.com/protected/document.docx

5. 设置 User-Agent (-A)

有些服务器会检查请求的 User-Agent 头,并可能阻止或提供不同的内容给非浏览器请求。您可以使用 -A--user-agent 选项来模拟一个浏览器。

bash
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" -O https://example.com/file.html

6. 包含 HTTP 头 (-H)

您可能需要发送自定义 HTTP 头,例如 Authorization 令牌或 Referer。使用 -H 选项:

bash
curl -H "Authorization: Bearer your_token_here" -O https://api.example.com/data
curl -H "Referer: https://example.com/previous-page" -O https://example.com/resource.jpg

7. FTP/SFTP 下载

curl 也支持从 FTP 和 SFTP 服务器下载文件。

  • FTP:
    bash
    curl -u ftpuser:ftppass -O ftp://ftp.example.com/path/to/file.txt

  • SFTP:
    bash
    curl -u sftpuser:sftppass -O sftp://sftp.example.com/path/to/file.txt

8. 显示下载进度和静默模式

  • 进度条 (-#--progress-bar):
    默认情况下,curl 会显示一个简单的下载进度。使用 -# 可以显示一个更直观的进度条。
    bash
    curl -# -O https://example.com/large_file.zip

  • 静默模式 (-s--silent):
    如果您不想看到任何下载信息(包括进度条和错误消息),可以使用 -s 选项。这在脚本中非常有用。
    bash
    curl -s -O https://example.com/somefile.txt

  • 详细模式 (-v--verbose):
    如果您需要调试下载过程,查看请求头、响应头和所有通信细节,可以使用 -v 选项。
    bash
    curl -v -O https://example.com/test.html

9. 限制下载速度 (--limit-rate)

在某些情况下,您可能需要限制 curl 的下载速度,以避免占用所有带宽。使用 --limit-rate 选项,后面跟速度限制(例如 100K 代表 100 Kilobytes/秒,1M 代表 1 Megabyte/秒)。

bash
curl --limit-rate 1M -O https://example.com/very_large_file.iso

10. 忽略 SSL 证书验证 (-k--insecure)

在测试环境或某些特殊情况下,您可能需要忽略 SSL/TLS 证书验证。请注意,在生产环境中使用此选项非常不安全,因为它会使您的连接容易受到中间人攻击。

bash
curl -k -O https://insecure-example.com/test.zip

常见问题与故障排除

  • “curl: (6) Could not resolve host:”
    这意味着 curl 无法将您提供的域名解析为 IP 地址。检查您的 URL 是否正确,网络连接是否正常,以及 DNS 设置。

  • “curl: (7) Failed to connect to host port 80: Connection refused”
    这通常表示目标服务器拒绝了连接。服务器可能宕机,防火墙阻止了连接,或者端口不正确。

  • “curl: (22) The requested URL returned error: 404 Not Found”
    服务器响应 404 HTTP 状态码,表示您请求的资源在服务器上不存在。检查 URL 路径。

  • “curl: (35) SSL connect error”
    这通常与 SSL/TLS 握手问题有关,可能是证书过期、不受信任的证书颁发机构或协议不兼容。在确认安全风险后,-k 选项可以暂时绕过,但应找出根本原因。

  • 下载文件后内容不完整或损坏:

    • 检查服务器是否正确发送了 Content-Length 头。
    • 尝试使用 -C - 进行断点续传。
    • 如果是文本文件,确认编码问题。
    • 确保下载过程中网络连接稳定。

总结

curl 是一个极其强大和灵活的工具,不仅限于下载文件。掌握上述技巧,您可以高效、可靠地从各种网络资源获取数据。无论是简单的文件下载,还是复杂的认证和协议处理,curl 都能胜任。熟练使用 curl 将极大地提升您的命令行操作效率。

滚动至顶部