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

时间:2020-01-09 10:39:51  来源:igfitidea点击:

Linux的curl命令比下载文件能做的更多。找出" curl"的功能,以及何时使用它代替" wget"。

curl vs. wget:有什么区别?

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

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

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

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

" curl"的作者有一个网页,描述了他看到的" curl"和" wget"之间的区别。

安装curl

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

sudo apt-get install curl

卷曲版本

--version选项使curl报告其版本。它还列出了它支持的所有协议。

curl --version

检索网页

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

curl https://www.bbc.com

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

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

将数据保存到文件

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

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

这次我们看不到检索到的信息,它会直接发送给我们。因为没有要显示的终端窗口输出,所以" curl"输出一组进度信息。

在上一个示例中它没有这样做,因为进度信息会分散在整个网页源代码中,因此curl会自动禁止它。

在这个例子中," curl"检测到输出被重定向到文件,并且可以安全地生成进度信息。

提供的信息是:

  • 总计百分比:要检索的总数。

  • 收到的百分比:到目前为止检索到的数据的百分比和实际值。

  • %Xferd:如果正在上传数据,则为已发送的百分比和实际值。

  • 平均速度Dload:平均下载速度。

  • 平均上传速度:平均上传速度。

  • 总时间:估计的总传输时间。

  • 花费的时间:到目前为止,此传输已用的时间。

  • 剩余时间:完成转移所需的估计时间

  • 当前速度:此传输的当前传输速度。

因为我们将输出从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命令发送到Web服务器相同。

curl -I www.twitter.com

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

下载多个URL

使用xargs,我们可以一次下载多个URL。也许我们想下载构成单个文章或者教程的一系列网页。

将这些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 < urls-to-download.txt

请注意,该命令使用-O(远程文件)输出命令,该命令使用大写的O。此选项使curl`以与远程服务器上文件相同的名称保存所检索的文件。

-n 1选项告诉xargs将文本文件的每一行视为一个参数。

运行命令时,我们会看到多次下载开始和结束,一个接一个。

在文件浏览器中签入显示多个文件已下载。每个人都有它在远程服务器上拥有的名称。

从FTP服务器下载文件

即使必须使用用户名和密码进行身份验证,在文件传输协议(FTP)服务器上使用curl也很容易。要使用curl传递用户名和密码,请使用-u(user)选项,然后键入用户名,冒号:和密码。请勿在冒号之前或者之后放置空格。

这是Rebex托管的免费测试FTP服务器。测试FTP站点的预设用户名是demo,密码为password。不要在生产或者真实FTP服务器上使用这种类型的弱用户名和密码。

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

将参数发送到远程服务器

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

作为一个简单的示例,可以查询theipify网站上的API,以确定外部IP地址。

curl https://api.ipify.org

通过在命令中添加format参数,并使用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