在本教程中,我们将介绍Linux中的cURL命令。我们会给出一些示例来指导您了解这个强大的实用程序的功能,帮助您理解它所能实现的所有功能。
cURL命令用于使用其20多种受支持协议之一,将数据下载或上传到服务器。此数据可以是文件、电子邮件或网页。
目录
- 什么是cURL命令?
- 下载文件
- 遵循重定向
- 停止并继续下载
- 指定超时
- 使用用户名和密码
- 使用代理
- 分块下载大文件
- 客户端证书
- Silent cURL
- 获取标题
- 多个headers
- 发布(上传)文件
- 发送电子邮件
- 阅读电子邮件
- cURL和wget之间的区别
什么是cURL命令?
cURL是与网站或API进行交互,向终端发送请求并显示响应或将数据记录到文件的理想工具。有时,它用作较大脚本的一部分,将检索到的数据交给其他函数进行处理。
由于cURL可用于从服务器检索文件,所以通常用于下载网站的一部分。它可以很好地执行此功能,但有时wget命令更适合这项工作。
在本文后面的内容中,我们将介绍wget和cURL之间的一些异同。
我们将在下面的部分中向您展示如何开始使用cURL。
下载文件
我们可以给cURL的最基本命令是下载网站或文件。除非我们指定一个不同的协议,否则cURL将使用HTTP作为其默认协议。要下载网站,只需发出以下命令:
代码语言:javascript复制$ curl http://www.google.com
当然,请输入要检索的任何网站或页面。
像这样执行基本命令而没有其他选项很少有用,因为这只会告诉cURL检索您所提供页面的源代码。
当我们运行命令时,我们的终端充满了HTML和其他Web脚本代码——在这种形式下,对我们来说不是特别有用。
让我们将网站下载为HTML文档,这样就可以显示内容,可以添加-output选项来实现cURL。
代码语言:javascript复制$ curl www.likegeeks.com --output likegeeks.html
现在,我们下载的网站可以打开并显示在浏览器中。
如果您要下载在线文件,则命令大致相同。但是请确保将-output选项附加到cURL中,就像我们在上面的示例中所做的那样。
如果您没有这样做,则cURL会将在线文件的二进制输出发送到您的终端,这可能会导致其发生故障。
这是我们开始下载500KB Word文档时的样子。
Word文档开始下载,并且终端中显示下载的当前进度。下载完成后,该文件将在我们保存该文件的目录中可用。
在此示例中,未指定目录,因此将其保存到当前的工作目录(运行cURL命令的目录)。
另外,您是否注意到我们在cURL命令中指定的-L选项了么?为了下载此文件,这是必要的,我们将在下一部分中介绍它的功能。
遵循重定向
如果在尝试对网站进行URL生成时输出为空,则可能意味着该网站告诉cURL重定向到其他URL。默认情况下,cURL不会遵循重定向,但是您可以使用 -L switch来告诉它。
代码语言:javascript复制$ curl -L www.likegeeks.com
在本文的研究中,我们发现有必要在大多数网站上指定-L,因此请务必记住这一小技巧。默认情况下,您甚至可能希望将其附加到大多数cURL命令中。
停止并继续下载
如果您的下载中断了,或者您需要下载一个大文件但又不想一次完成所有操作,所以cURL提供了一种选项,可以从中断处继续传输。
要手动停止传输,您可以使用ctrl c组合键结束cURL进程,就像停止当前正在运行的几乎所有进程一样。
我们的下载已经开始,但是被ctrl c中断了,现在让我们使用以下语法恢复下载:
代码语言:javascript复制$ curl -C - example.com/some-file.zip --output MyFile.zip
-C switch是恢复我们文件传输的设备,但还要注意,它后面紧跟一个破折号(-)。这告诉cURL继续文件传输,但是实现这一步,首先要查看已经下载的部分,找到下载的最后一个字节才可以确定从何处可以恢复。
这时候我们的文件传输已恢复,可以继续完成下载。
指定超时
如果您希望cURL在您不做操作之后的一段时间还可以继续之前的工作,那么可以在命令中指定超时,这特别有用,因为cURL中的某些操作默认情况下没有超时,所以如果您不希望其无限期挂起,则需要指定一个。
您可以使用-m switch指定执行命令所需的最长时间。经过指定的时间后,cURL将退出正在执行的操作,即使它正在下载或上传文件。
cURL会以秒为单位指定您想要的最长时间。因此,要在一分钟后超时,该命令将如下所示:
代码语言:javascript复制$ curl -m 60 example.com
您可以使用cURL指定的另一种超时类型是用于链接的时间量。这有助于确保cURL不会花费过多的时间来尝试连接处于脱机状态或无法访问的主机。
它也接受秒作为参数。该选项被写为–connect-timeout。
代码语言:javascript复制 $ curl --connect-timeout 60 example.com
使用用户名和密码
您可以使用-u switch在cURL命令中指定用户名和密码。例如,如果您想通过FTP服务器进行身份验证,则语法如下所示:
代码语言:javascript复制 $ curl -u username:password ftp://example.com
您可以将其用于任何协议,但是FTP通常用于诸如此类的简单文件传输。
如果要下载上面的屏幕快照中显示的文件,我们只需使用文件的完整路径发出相同的命令。
代码语言:javascript复制$ curl -u username:password ftp://example.com/readme.txt
使用代理
在连接主机之前,很容易直接使用cURL来使用代理。cURL将默认使用HTTP代理,除非您另外指定。
使用-x switch定义代理。由于在此示例中未指定协议,因此cURL将假定它是HTTP代理。
代码语言:javascript复制$ curl -x 192.168.1.1:8080 http://example.com
此命令将使用端口8080上的192.168.1.1作为代理连接到example.com。
您也可以将其与其他协议一起使用。下面是一个使用HTTP代理将UR cURLL到FTP服务器并检索文件的示例。
代码语言:javascript复制$ curl -x 192.168.1.1:8080 ftp://example.com/readme.txt
cURL支持许多其他类型的代理和与这些代理一起使用的选项,但进一步扩展将超出本指南的范围。请查阅cURL手册页,以获取有关代理 tunneling,SOCKS代理,身份验证等的更多信息。
分块下载多个文件
我们已经展示了如何停止和恢复文件传输,但是如果我们希望cURL仅下载文件的一部分怎么办?这样,我们可以下载多个块文件。
如果您需要保持下载上限或类似限制,则可以仅下载文件的某些部分。 –range标志用于完成此操作。
大小必须以字节为单位。因此,如果我们想以100 MB的块大小下载最新的Ubuntu .iso文件,则第一个命令将如下所示:
代码语言:javascript复制$ curl --range 0-99999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part1
第二个命令将需要在下一个字节提取并下载另一个100 MB的块。
代码语言:javascript复制$ curl --range 0-99999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part1
代码语言:javascript复制$ curl --range 100000000-199999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part2
重复此过程,直到下载了所有块。最后一步是将这些块组合到一个文件中,这可以使用cat命令来完成。
代码语言:javascript复制$ cat ubuntu-part? > ubuntu-18.04.3-desktop-amd64.iso
客户端证书
要使用证书身份验证而不是基本身份验证访问服务器,可以使用–cert选项指定证书文件。
代码语言:javascript复制$ curl --cert path/to/cert.crt:password ftp://example.com
cURL对于证书文件的格式有很多选项。
还有更多与证书相关的选项:–cacert、–cert-status、–cert-type等。请查看手册页以获取选项的完整列表。
Silent cURL
如果您不想显示cURL的进度表和错误消息,则-s switch可提供该功能。它仍然会输出您请求的数据,因此,如果您希望命令100%保持静音,则需要将输出定向到一个文件中。
将此命令与-O flag结合使用可将文件保存在当前的工作目录中。这将确保cURL返回0输出。
代码语言:javascript复制$ curl -s -O http://example.com
或者,您可以使用–output选项选择保存文件的位置并指定名称。
代码语言:javascript复制$ curl -s http://example.com --output index.html
获取标题
使用cURL来获取远程地址的标题非常简单,您只需要使用-I选项即可。
代码语言:javascript复制$ curl -I example.com
如果将此选项与–L选项结合使用,则cURL将返回其重定向到的每个地址的headers。
代码语言:javascript复制$ curl -I -L example.com
多个标题
您可以使用-H选项将header传递给cURL。要传递多个header,您只需多次使用-H选项。这是一个例子:
代码语言:javascript复制$ curl -H 'Connection: keep-alive' -H 'Accept-Charset: utf-8 ' http://example.com
发布(上传)文件
POST是网站接受数据的常用方式。例如,当您在线填写表格时,很有可能是使用POST方法从浏览器发送数据。要将数据以这种方式发送到网站,请使用-d选项。
代码语言:javascript复制$ curl -d 'name=geek&location=usa' http://example.com
要上传文件而不是文本,语法应如下所示:
代码语言:javascript复制 $ curl -d @filename http://example.com
根据需要使用多个-d标志,以指定要尝试上载的所有不同数据或文件名。
如果要将文件上传到FTP服务器,则可以使用-T选项。
代码语言:javascript复制$ curl -T myfile.txt ftp://example.com/some/directory/
发送电子邮件
发送电子邮件只是将数据从您的计算机(或其他设备)上传到电子邮件服务器。由于cURL能够上传数据,因此我们可以使用它来发送电子邮件。有很多选项,但是这里有一个有关如何通过SMTP服务器发送电子邮件的示例:
代码语言:javascript复制$ curl smtp://mail.example.com --mail-from me@example.com --mail-rcpt john@domain.com –upload-file email.txt
您的电子邮件文件需要正确格式化。像这样:
代码语言:javascript复制$ cat email.txt
From: Web Administrator <me@example.com>
To: John Doe <john@domain.com>
Subject: An example email
Date: Sat, 7 Dec 2019 02:10:15
John,
Hope you have a great weekend.
-Admin
像往常一样,可以在cURL的手册页中找到更详细、更专业的选项。
阅读电子邮件
cURL支持IMAP(和IMAPS)和POP3,两者均可用于从邮件服务器检索电子邮件。
像这样使用IMAP登录:
代码语言:javascript复制$ curl -u username:password imap://mail.example.com
此命令将列出可用的邮箱,但不查看任何特定的邮件。为此,请使用–X选项指定消息的UID。
代码语言:javascript复制$ curl -u username:password imap://mail.example.com -X 'UID FETCH 1234'
cURL和wget之间的区别
有时人们会混淆cURL和wget,因为它们都能够从服务器检索数据。但这是他们唯一的共同点。
我们在本文中展示了cURL的功能。 wget提供了一组不同的函数。 wget是下载网站的最佳工具,并且能够递归遍历目录和链接以下载整个网站。
要下载网站,请使用wget。如果使用HTTP或HTTPS以外的其他协议或用于上传文件,请使用cURL。 cURL也是从Web下载单个文件的不错选择,不过wget也做得很好。