如何使用 curl 从 Linux 命令行下载文件

Linux curl 命令可以做的不仅仅是下载文件。 找出 curl 的功能,以及何时应该使用它而不是 wget。

curl 与 wget :有什么区别?

人们经常难以确定 wget 和 curl 命令的相对优势。 这些命令确实有一些功能重叠。 他们每个人都可以从远程位置检索文件,但这就是相似性结束的地方。

wget 是一个 下载内容和文件的绝佳工具. 它可以下载文件、网页和目录。 它包含遍历网页中的链接并在整个网站上递归下载内容的智能例程。 它是无与伦比的命令行下载管理器。

卷曲满足 完全不同的需求. 是的,它可以检索文件,但它不能递归地浏览网站以查找要检索的内容。 curl 实际上所做的是让您通过向远程系统发出请求,并检索和显示它们对您的响应来与远程系统进行交互。 这些响应很可能是网页内容和文件,但它们也可以包含由于 curl 请求提出的“问题”而通过 Web 服务或 API 提供的数据。

而且 curl 不仅限于网站。 curl 支持 20 多种协议,包括 HTTP、HTTPS、SCP、SFTP 和 FTP。 并且可以说,由于其对 Linux 管道的出色处理,curl 可以更轻松地与其他命令和脚本集成。

curl的作者有一个网页 描述他看到的差异 在 curl 和 wget 之间。

安装卷曲

在用于研究本文的计算机中,Fedora 31 和 Manjaro 18.1.0 已经安装了 curl。 curl 必须安装在 Ubuntu 18.04 LTS 上。 在 Ubuntu 上,运行以下命令来安装它:

sudo apt-get install curl

卷曲版本

–version 选项使 curlreport 成为其版本。 它还列出了它支持的所有协议。

curl --version

检索网页

如果我们将 curl 指向一个网页,它会为我们检索它。

curl https://www.bbc.com

但它的默认操作是将其作为源代码转储到终端窗口。

当心:如果您不告诉 curl 您想要将某些内容存储为文件,它将始终将其转储到终端窗口。 如果它正在检索的文件是二进制文件,则结果可能是不可预测的。 shell 可能会尝试将二进制文件中的某些字节值解释为控制字符或转义序列。

  如何在 Linux 上安装 SolveSpace

将数据保存到文件

让我们告诉 curl 将输出重定向到一个文件中:

curl https://www.bbc.com  > bbc.html

curl https://www.bbc.com > bbc.html 在终端窗口中” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>这一次我们看不到检索到的信息,它是直接发送给我们的文件。 因为没有终端窗口输出要显示,所以 curl 输出了一组进度信息。</p>
<p>在前面的例子中并没有这样做,因为进度信息会分散在整个网页源代码中,所以 curl 会自动抑制它。</p>
<p>在这个例子中,curl 检测到输出被重定向到一个文件,并且生成进度信息是安全的。</p>
<p><img loading=

提供的信息是:

% Total:要检索的总金额。
% Received:到目前为止检索到的数据的百分比和实际值。
% Xferd:如果正在上传数据,则发送的百分比和实际值。
平均下载速度:平均下载速度。
平均上传速度:平均上传速度。
总时间:估计的传输总持续时间。
花费的时间:到目前为止此传输已用的时间。
剩余时间:完成传输的预计剩余时间
当前速度:此传输的当前传输速度。

因为我们将 curl 的输出重定向到了一个文件,所以我们现在有了一个名为“bbc.html”的文件。

双击该文件将打开您的默认浏览器,以便显示检索到的网页。

注意浏览器地址栏中的地址是本机本地文件,不是远程网站。

我们不必重定向输出来创建文件。 我们可以使用 -o(输出)选项创建文件,并告诉 curl 创建文件。 在这里,我们使用 -o 选项并提供我们希望创建的文件的名称“bbc.html”。

curl -o bbc.html https://www.bbc.com

使用进度条监控下载

要将基于文本的下载信息替换为简单的进度条,请使用 -#(进度条)选项。

curl -x -o bbc.html https://www.bbc.com

重新启动中断的下载

重新启动已终止或中断的下载很容易。 让我们开始下载一个相当大的文件。 我们将使用 Ubuntu 18.04 的最新长期支持版本。 我们使用 –output 选项指定我们希望将其保存到的文件的名称:“ubuntu180403.iso”。

curl --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

下载开始并逐步完成。

如果我们用 Ctrl+C 强行中断下载,我们将返回命令提示符,并放弃下载。

要重新开始下载,请使用 -C(继续)选项。 这会导致 curl 在目标文件中的指定点或偏移处重新开始下载。 如果您使用连字符 – 作为偏移量,curl 将查看文件的已下载部分并确定要用于自身的正确偏移量。

curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

重新开始下载。 curl 报告它重新启动的偏移量。

检索 HTTP 标头

使用 -I (head) 选项,您只能检索 HTTP 标头。 这与发送 HTTP HEAD 命令 到网络服务器。

curl -I www.twitter.com

此命令仅检索信息; 它不下载任何网页或文件。

下载多个 URL

使用 xargs 我们可以下载多个 网址 立刻。 也许我们想下载组成一篇文章或教程的一系列网页。

将这些 URL 复制到编辑器并将其保存到名为“urls-to-download.txt”的文件中。 我们可以使用 xargs 来 对待每一行的内容 文本文件的参数作为它将依次提供给 curl 的参数。

https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#0
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#1
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#2
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#3
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#4
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#5

这是我们需要使用的命令,让 xargs 一次将这些 URL 传递给 curl:

xargs -n 1 curl -O 

Note that this command uses the -O (remote file) output command, which uses an uppercase “O.” This option causes curl to save the retrieved  file with the same name that the file has on the remote server.

The -n 1 option tells xargs to treat each line of the text file as a single parameter.

When you run the command, you’ll see multiple downloads start and finish, one after the other.

Checking in the file browser shows the multiple files have been downloaded. Each one bears the name it had on the remote server.

Downloading Files From an FTP Server

Using curl with a File Transfer Protocol (FTP) server is easy, even if you have to authenticate with a username and password. To pass a username and password with curl use the -u (user) option, and type the username, a colon “:”, and the password. Don’t put a space before or after the colon.

This is a free-for-testing FTP server hosted by Rebex. The test FTP site has a pre-set username of “demo”, and the password is “password.” Don’t use this type of weak username and password on a production or “real” FTP server.

curl -u demo:password ftp://test.rebex.net

curl 发现我们将它指向 FTP 服务器,并返回服务器上存在的文件列表。

此服务器上唯一的文件是“readme.txt”文件,长度为 403 字节。 让我们找回它。 使用与刚才相同的命令,并附加文件名:

curl -u demo:password ftp://test.rebex.net/readme.txt

检索文件并 curl 在终端窗口中显示其内容。

在几乎所有情况下,为我们将检索到的文件保存到磁盘会更方便,而不是显示在终端窗口中。 我们可以再次使用 -O(远程文件)输出命令将文件保存到磁盘,文件名与远程服务器上的文件名相同。

curl -O -u demo:password ftp://test.rebex.net/readme.txt

该文件被检索并保存到磁盘。 我们可以使用 ls 来检查文件的详细信息。 它与 FTP 服务器上的文件同名,长度相同,均为 403 字节。

ls -hl readme.txt

向远程服务器发送参数

一些远程服务器将接受发送给它们的请求中的参数。 例如,这些参数可能用于格式化返回的数据,或者它们可能用于选择用户希望检索的确切数据。 通常可以与网络交互 应用程序编程接口 (API) 使用 curl。

举个简单的例子, ipify 网站有一个 API 可以查询以确定您的外部 IP 地址。

curl https://api.ipify.org

通过在命令中添加格式参数,使用“json”的值,我们可以再次请求我们的外部 IP 地址,但这一次返回的数据将被编码在 JSON格式.

curl https://api.ipify.org?format=json

这是另一个使用 Google API 的示例。 它返回一个描述一本书的 JSON 对象。 您必须提供的参数是 国际标准书号 (ISBN) 一本书的编号。 您可以在大多数书籍的封底上找到这些,通常在条形码下方。 我们将在这里使用的参数是“0131103628”。

curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628

返回的数据很全面:

有时卷曲,有时 wget

如果我想从网站下载内容并让网站的树结构递归搜索该内容,我会使用 wget。

如果我想与远程服务器或 API 交互,并可能下载一些文件或网页,我会使用 curl。 特别是如果该协议是 wget 不支持的众多协议之一。