如果您正在寻找快速答案,该curl -O命令可让您使用curl 命令行实用程序下载文件。当然,关于使用 curl 下载文件,要学习的不仅仅是-O参数。
这里我们将提供多个 curl 下载命令的示例,您可以使用这些命令来满足不同的要求。如果您是 curl 新手,我们建议您完整阅读本文。如果您熟悉 curl 但只需要快速复习一下,请随时跳到特定部分。
什么是curl?
curl 是一个开源命令行实用程序,用于使用 URL 语法和广泛的网络协议(包括 HTTP(S)、FTP、SFTP、LDAP(S) 和 SMTP)传输数据。curl 命令行实用程序是包含libcurl 库的 cURL(“URL 客户端”)项目的一部分。
由于 curl 通常“正常工作”,具有高度可移植性并默认安装在许多系统上,并且是 API 文档中的事实标准,因此它是开发人员和 DevOps 工程师中的流行工具。
先决条件
如果您运行的是现代 Linux 操作系统,那么您可能拥有需要遵循的一切。可以肯定的是,这里有先决条件:
- curl - curl 默认安装在大多数流行的 *nix 操作系统上,包括 macOS。它也适用于现代 Windows 操作系统。curl -V您可以通过从终端运行命令来检查是否安装了 curl 。输出应类似于:
如果您是 Linux 用户并且没有安装 curl,您可以使用操作系统的默认包管理器(例如 apt、yum 或 zypper)下载它。这里有各种其他操作系统的 curl 下载链接。
- 连接到服务器以从中下载文件 - 我们将为大多数示例命令使用 HTTPS 连接,我们建议您也这样做。但是,curl 支持超过两打协议。只要您有权访问服务器以从至少支持 curl 之一的协议下载文件,就可以按照示例命令进行操作。请务必将我们的示例链接(例如http://speedtest.lt.cherryservers.com/test-100mb)替换为您要下载的文件的链接。
?专业提示: 您可以组合 curl 参数。在大多数示例中,我们将坚持在 curl 命令中使用一个或两个参数。但是,curl 也支持组合参数。例如,如果要下载文件 (-O)、遵循 301 重定向 (-L) 并允许不安全的 SSL 证书 (-k),则可以使用 curl -OLk。
下载文件
使用 curl 下载文件的基本语法是:
curl -O <protocol>://<site>/<path/to/file>
例如,要使用 HTTPS 从 http://speedtest.lt.cherryservers.com/test-1000mb 下载 1GB 的虚拟日期,请使用以下命令:
curl -O http://speedtest.lt.cherryservers.com/test-100mb
称为curl progress meter的输出类似于以下内容:
默认情况下,您下载的文件保存在您当前的工作目录中。下面是一个端到端的可视化示例。
用不同的名称保存下载的文件
该curl -O命令使用来自远程服务器的文件名将文件本地保存在当前工作目录中。您可以使用指定不同的本地文件名和下载位置curl -o。基本语法是:
curl -o </path/to/save/location/filename> <protocol>://<site>/<path/to/file>
要在本地 /tmp 目录中将 http://speedtest.lt.cherryservers.com/test-1000mb 保存为 mydownload.zip,请使用以下命令:
curl -o /tmp/mydownload.zip http://speedtest.lt.cherryservers.com/test-1000mb
指定非默认端口
默认情况下,curl 使用协议的默认端口(80 用于 HTTP,443 用于 HTTPS,21 用于 FTP,等等)。要指定非默认端口,请附加:[port_number]到远程服务器的域名或 IP 地址的末尾。
基本语法是:
curl -O <protocol>://<site>:[port_number]/<path/to/file>
使用我们的http://speedtest.lt.cherryservers.com/test-1000mb示例,如果 HTTP 服务器在端口 4040 上运行,您将使用此命令:
curl -O http://speedtest.lt.cherryservers.com:4040/test-1000mb
重新启动中断的下载
在某些情况下,例如当您通过较差的网络连接下载大文件时,文件下载会中断。-C - 选项允许您恢复中断的下载。基本语法是:
curl -C - -o <local_filename> <protocol>://<site>/<path/to/file>
例如,要在本地下载为 /tmp/mydownload.zip 时恢复 example.zip 的 HTTPS 下载,请使用以下命令:
curl -C - -o /tmp/mydownload.zip http://speedtest.lt.cherryservers.com/test-1000mb
在显示 curl 进度表之前,输出将包含类似于以下内容的文本:
一条命令下载多个文件
您可以在单个 curl 命令中指定多个 URL,以便在一个命令中下载多个文件。
基本语法是:
curl -O <protocol>://<site_1>/<path/to/file_1> -O <protocol>://<site_2>/<path/to/file_2>
例如,要下载 http://speedtest.lt.cherryservers.com/test-1000mb 和 http://speedtest.lt.cherryservers.com/test-100mb 使用此命令:
curl -O http://speedtest.lt.cherryservers.com/test-1000mb -O http://speedtest.lt.cherryservers.com/test-100mb
curl 进度表将显示每个下载的统计信息。对于两个 URL,输出将类似于以下内容:
如果您有很长的 URL 列表,您可以将它们添加到一个文本文件中,然后使用xargs. 为了演示,假设我们有一个curlsites.txt文件,其中包含我们的 URL,将每个 URL 放在一个新行上:
http://speedtest.lt.cherryservers.com/test-1000mb
http://speedtest.lt.cherryservers.com/test-100mb
我们现在可以使用xargs命令curl和我们的curlsites.txt文件作为输入来下载每个文件:
xargs -n 1 curl -O < curlsites.txt
在 Pralel 中下载多个文件
通常,curl 一个一个地处理 URL,上面的 xargs 示例也是如此。但是,您可以将-P参数添加到 xargs 以并行下载多个文件。例如,此命令将并行运行两个 curl 下载。
xargs -P 2 -n 1 curl -O < curlsites.txt
有关 xargs 及其选项的更多详细信息,请查看xargs 手册页。
使用速率限制
速率限制让您可以为 curl 请求指定最大传输速率。将速率限制应用于 curl 下载请求的基本语法是:
curl --limit-rate <speed> -O <protocol>://<site>/<path/to/file>
默认情况下,<speed>以每秒字节数为单位。您可以附加以下后缀之一来更改度量单位:
- K或k= 千字节
- M或m= 兆字节
- G或g= 千兆字节
例如,要在我们的示例下载中设置每秒 1000 字节的速率限制,我们可以使用以下命令:
curl --limit-rate 1000 -O http://speedtest.lt.cherryservers.com/test-100mb
或者这个命令:
curl --limit-rate 1k -O http://speedtest.lt.cherryservers.com/test-100mb
要限制为每秒 100 兆字节:
curl --limit-rate 100m -O http://speedtest.lt.cherryservers.com/test-100mb
请注意,curl 会尝试平均传输速度以不超过该<speed>值。当您第一次使用该--limit-rate选项运行 curl 时,您可能会看到速度高于指定值,<speed>但它们应该会很快趋于平稳。
自动中止慢速下载
如果您下载文件的服务器速度太慢,您可能希望自动中止连接。您可以使用-Y(or --speed-limit) 和-y(or --speed-time) 选项。
-Y(或--speed-limit)选项定义速度(以字节/秒为单位)。( -yor --speed-time) 选项指定以秒为单位的时间量。-Y如果下载速度在 定义的时间内低于定义的速度-y,curl 将中止下载。-Y如果-y未指定,则默认时间为 30 秒。下面是三个示例来演示。
- 如果速度低于 ~100 KB/s(千字节每秒)持续 10 秒,则中止下载:
curl -O -Y 100000 -y 10 http://speedtest.lt.cherryservers.com/test-1000mb - 如果速度低于 ~100 MB/s(每秒兆字节)达 15 秒,则中止下载:
curl -O -Y 100000000 -y 15 http://speedtest.lt.cherryservers.com/test-1000mb - 如果速度低于 1KB/s 持续 30 秒,则中止下载(默认 30 秒,因此无需指定 -y):
curl -O -Y 1000 http://speedtest.lt.cherryservers.com/test-1000mb
如果 curl 由于传输速度限制而中止下载,它将打印类似于以下内容的错误消息:
显示下载状态栏
--progress-bar您可以使 curl 显示带参数的进度条,而不是标准进度条。进度条将以百分比形式显示下载进度,并在终端上显示 # 符号。
您可以将该参数附加--progress-bar到大多数 curl 命令。以下是带参数的基本语法 HTTPS 下载命令--progress-bar:
curl -O <protocol>://<site>/<path/to/file> --progress-bar
进度条输出类似于:
使 Curl 遵循 301 重定向
从 HTTP(S) 服务器下载文件时,301 重定向很常见。要让 curl 遵循 301 重定向,请使用 -L 参数。
下面是带有 -L 参数的 301 重定向的基本语法示例:
curl -OL <protocol>://<site>/<path/to/file>
curl -L -o </path/to/save/location/filename> <protocol>://<site>/<path/to/file>
使用基本身份验证
虽然像OAuth 2.0这样的现代身份验证形式在现代 HTTP 服务器上更为常见,但在某些情况下,可以使用需要用户名和密码的基本身份验证来保护下载。例如,FTP 下载是基本身份验证的典型用例。-u您可以使用参数提供用于基本身份验证的用户名和密码。
curl 下载请求的基本身份验证的基本语法是:
curl -u <username>:<password> -O <protocol>://<site>/<path/to/file>
抑制卷曲输出
您可以使用参数抑制 curl 的输出-s。使用 curl 静默下载文件的基本语法是:
curl -Os <protocol>://<site>/<path/to/file>
此命令就像 -O 一样下载文件,但不会将进度或统计信息打印到标准输出。
允许不安全的 SSL/TLS 证书
在某些情况下,您可能希望通过 HTTPS 下载文件,即使服务器具有无效证书或自签名证书也是如此。您可以使用 -k 选项让 curl 在不验证 TLS/SSL 证书的情况下继续。请注意,此行为不安全!
以下是允许不安全的 SSL 证书进行 curl 下载的基本语法:
curl -Ok https://<site>/<path/to/file>
如果您有意连接到具有不安全 TLS/SSL 证书的站点,-k 参数可以帮助解决以下错误:
我们还建议访问错误消息中提到的官方页面,以获取有关 curl 和 TLS/SSL 的更多详细信息。
使用 FTP 和 SFTP 下载文件
除了 HTTP(S) 之外,FTP 和 SFTP 也是 curl 可用于下载文件的流行协议。您可以通过在命令中指定这些协议来使用 FTP 或 SFTP,就像我们在其他示例中使用 HTTPS 一样。
由于 FTP 和 SFTP 服务器通常需要用户名和密码,因此我们将在示例中使用 -u 参数。
使用 curl 进行 FTP 下载的基本语法:
curl -u <username>:<password> -O ftp://<site>/<path/to/file>
对于 SFTP:
curl -u <username>:<password> -O sftp://<site>/<path/to/file>