Linux中的CURL命令教程以及示例用法
将数据从一个地方传输到另一个地方是使用连接到网络的计算机完成的主要任务之一。
那里有很多用于发送和接收数据的GUI工具,但是当我们在控制台上工作时,只有配备了命令行功能,使用curl是不可避免的。
鲜为人知的事实是curl可以使用多种协议,并且可以轻松解决大多数脚本任务。
默认情况下,大多数发行版中都安装了CURL。
如果我们没有安装curl工具,则只需执行一条apt-get(apt-get安装curl)或者yum(yum install curl)命令即可。
安装curl将安装curl命令行工具以及libcurl库。
在Ubuntu系统上,软件包名称如下。
- curl_7.22.0-3ubuntu4.7_amd64.deb
- libcurl3_7.22.0-3ubuntu4.7_amd64.deb
什么是curl,是什么使它成为了出色的命令行工具?
由于以下原因,CURL真是太棒了...
- CURL是易于使用的命令行工具来发送和接收文件,它支持几乎所有主要协议(DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP ,RTSP,SCP,SFTP,SMTP,SMTPS,TELNET和TFTP)。
- 可以轻松地在shell脚本中使用
- 支持暂停和恢复下载等功能
- 它具有大约120个命令行选项,可以执行各种任务
- 它可以在所有主要操作系统上运行(超过40个操作系统)
- 支持cookie,表格和SSL
- curl命令行工具和libcurl库都是开源的,因此可以在任何程序中使用
- 它支持配置文件
- 单个命令多次上传
- 进度列,速率限制和下载时间详细信息
- ipv6支持
基本CURL命令用法
让我们开始研究一些在Linux中使用curl的非常基本的示例。
默认情况下,curl将在控制台上显示整个输出。
curl的一个不错的功能是根据我们使用的URL主机名猜测协议。
例如,如果我们提供一个名为ftp.example.com的URL(CURL将使用FTP协议来获取数据)。
但是如果curl无法猜测协议,那么它将默认为HTTP。
24小时现金博克斯堡
root@ubuntu1:~# curl example.com
上面的命令将在example.com URL上显示整个HTTP内容。
在这里curl也试图猜测协议。
但由于找不到任何内容,因此默认为HTTP。
通常情况下,我们将必须指定包含协议信息的URI,以便curl将使用所需的协议来获取数据。
例如,protocol://prefix
前面显示的示例命令不会保存html输出(它将在控制台本身中显示输出。
)。
如果要将输出保存到文件,则可以在linux中使用重定向方法,也可以在curl中使用-o选项。
root@ubuntu1:~# curl example.com > example.html % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1270 100 1270 0 0 2645 0 --:--:-- --:--:-- --:--:-- 5852
上面的命令会将输出保存到example.html文件。
我们也可以在curl中使用-o选项,如下所示。
root@ubuntu1:~# curl -o example.html example.com % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1270 100 1270 0 0 2617 0 --:--:-- --:--:-- --:--:-- 5799
这两种方法都将向我们显示下载详细信息,例如传输速率,时间,字节等。
使用单个CURL命令下载多个文件
使用-O选项,可以使用CURL命令同时下载多个文件。
这里要注意的重要事实是,curl将使用相同的TCP连接下载多个文件。
这样做是为了提高下载速度。
建立与目标服务器的TCP连接需要多个过程。
它称为三向握手。
为了减少进行三向握手的时间,curl将尝试使用同一连接来执行由单个命令发出的从同一服务器进行的所有下载。
相关:什么是TCP三向握手
root@ubuntu1:~# curl -O libiconv-1.14.tar.gz http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.10.tar.gz -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz
上面的命令将从ftp.gnu.org下载软件包libiconv的三个不同版本(请注意,这三个URL都不同。
)。
使用-O选项的另一个优点是它将输出保存到与URL文件名完全相同的文件中。
在我们的示例中,它将保存文件名为libiconv-1.10.tar.gz,libiconv-1.12.tar.gz,libiconv-1.13.tar.gz的所有三个文件。
使用CURL进行HTTP重定向
302和301都是用于HTTP重定向的广泛接受的状态代码。
302通常用于临时重定向,而301则永久移动。
在使用CURL时遇到这样的URL是很正常的。
HTTP旨在使用新URL进行答复,客户端可以从中获取数据。
如果我们尝试使用CURL到google.com(而不是www.google.com),则Google会进行这种重定向。
HTTP响应将包含两件事。
它将包含状态代码301或者302,以及客户端可以使用的备用URL。
当网络浏览器遇到301或者302时,它们将自动将我们重定向到备用URL。
但是,如果发生curl,它将向我们显示服务器返回的确切消息。
让我告诉你这个..
root@ubuntu1:~# curl google.com <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.com/">here</A>. </BODY></HTML>
如果希望CURL自动重定向到新URL,则需要使用-L选项,如下所示。
root@ubuntu1:~# curl -L google.com
使用Curl命令暂停/继续下载
与任何GUI下载管理器类似,我们可以使用CURL暂停和继续下载。
可以使用-C选项来实现,如下所示。
首先开始下载,然后取消它(使用CTRL + C)。
root@ubuntu1:~# curl -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 4867k 0 1196 0 0 1631 0 0:50:56 --:--:-- 0:50:56 5363
现在让我们继续下载...
root@ubuntu1:~# curl -C - -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz ** Resuming transfer from byte position 28672 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 4839k 0 30339 0 0 21558 0 0:03:49 0:00:01 0:03:48 27185
在恢复传输时,它清楚地表明从字节28672开始恢复。
这是因为curl试图从当前目录中的部分保存的文件libiconv-1.14.tar.gz中获取先前下载的字节。
在找到部分下载的文件后,它从上次离开的地方恢复了。
查看带有CURL的完整请求和响应标头
Linux中的命令通常带有一个称为verbose的选项。
在详细输出中,它向我们显示该命令遇到的完整信息。
在curl中使用详细输出可以查看所有标头(请求和响应)。
仅通过传递-v即可使用Verbose
root@ubuntu1:~# curl -v example.com
这将向我们显示curl在满足请求时遇到的完整标头。
标头包括已发送的请求标头,已接收的响应标头等。
相关:HTTP请求和响应教程
仅显示CURL中的响应标题
有时,我们只想查看服务器返回的响应头,而没有看到实际的响应内容。
可以在脚本中使用它来验证响应状态,响应字节或者响应服务器类型等。
root@ubuntu1:~# curl -I example.com HTTP/1.1 200 OK Accept-Ranges: bytes Cache-Control: max-age=604800 Content-Type: text/html Date: Mon, 17 Mar 2014 12:42:14 GMT Etag: "359670651" Expires: Mon, 24 Mar 2014 12:42:14 GMT Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT Server: ECS (iad/19AB) X-Cache: HIT x-ec-custom-error: 1 Content-Length: 1270
将代理服务器与CURL一起使用
如果要通过代理服务器发送请求,则可以使用-x选项,如下所示。
有时,这些代理服务器首先需要身份验证。
让我们看看如何使用代理身份验证执行curl请求。
root@ubuntu1:~# curl -x http://proxyserver:proxyport --proxy-user user:password -L http://example.com
在上面的命令中,proxyserver是代理服务器主机名或者IP地址,proxyport是代理服务器的端口,而user:password当然是代理凭据。
我已经使用-L选项来跟踪curl遇到的所有重定向(如在使用CURL的跟随HTTP重定向中所见)。
忽略带有CURL的SSL证书错误
SSL证书需要由授权的证书颁发机构签名。
否则,诸如浏览器之类的用户代理会警告我们,并要求用户执行诸如按继续按钮之类的操作。
如果发现未知的ssl证书,curl通常根本不会继续连接。
尽管它具有很好的安全性功能,但我们确实为内部服务器配置了内部自签名证书。
在这种情况下,我们需要接受未知证书警告并继续请求。
可以使用-k选项使用curl来完成此操作,如下所示。
root@ubuntu1:~# curl -k https://10.1.136.101:4848
相关:SSL如何工作?
修改HTTP请求中的用户代理
Web浏览器发送HTTP请求时,它将在请求中包含其自己的详细信息。
此详细信息允许服务器识别浏览器详细信息。
包含此信息的HTTP请求标头称为用户代理。
基本上,服务器可以配置为针对不同的用户代理使用不同的页面布局进行响应。
客户端发送的用户代理信息将在服务器日志中可见。
Firefox Web浏览器发送的普通HTTP请求将具有一个类似于“ Mozilla/5.0(Windows; U; Windows NT 5.1; de; rv:1.9.2.3)”的用户代理。
使用curl可以将用户代理值修改为所需的字符串,如下所示。
root@ubuntu1:~# curl -A "YOUR USER AGENT STRING GOES HEERE" http://example.com
使用Curl下载速率限制
我们可以要求curl将下载速度限制为所需的值。
当我们不希望curl命令消耗大量可用带宽时,这将非常有帮助。
可以使用以下方法来完成。
root@ubuntu1:~# curl --limit-rate 100k -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.10.tar.gz
在上面的命令中,k代表千字节。
我们还可以使用B使用字节,使用m使用兆字节,使用G使用千兆字节。
使用CURL进行FTP下载和上传
正如本文开头所讨论的,CURL可以与不同类型的协议一起使用。
通常的用途是从ftp服务器上载/下载文件,而实际上没有任何ftp客户端软件。
这可以通过在curl中传递--user参数来完成。
让我们看看如何做到这一点。
使用CURL从FTP服务器下载文件
root@ubuntu1:~# curl ftp://example.com/mydirectory/myfile.zip --user username:password -o myfile.zip
上面显示的命令将从ftp://example.com/mydirectory下载文件myfile.zip,并将其另存为myfile.zip。
但是,如果我们想首先查看FTP服务器的目录结构,则可以通过以下方法进行操作。
root@ubuntu1:~# curl ftp://example.com --user username:password
上面的命令将列出用户doc根目录下的目录和文件。
使用CURL将文件上传到FTP服务器
可以使用curl中的-T选项完成上传,并且非常简单明了。
其如下所示。
root@ubuntu1:~# curl -T myfile.zip ftp://example.com/mydirectory/--user username:password
删除FTP服务器上的文件
我们还可以使用curl命令删除FTP服务器上的文件,如下所示。
root@ubuntu1:~# curl ftp://example.com/-X 'DELE myfile.zip' --user username:password
使用CURL发送EMAIL
如果我们阅读curl支持的协议列表,则也会找到SMTP。
因此curl命令也可以用来发送电子邮件。
一个例子如下所示。
root@ubuntu1:~# curl --url "smtps://smtp.example.com:465" --ssl-reqd --mail-from "[email protected]" --mail-rcpt "[email protected]" --upload-file mailcontent.txt --user "[email protected]:password" --insecure
在上面的命令中,将smtps://smpt.example.com:465替换为SMTP服务器和端口。
--mail-from:此字段包含收件人应该看到的发件人地址。
--mail-rcpt:此字段包含收件人地址
--upload-file:此处提供的文件应包含邮件内容
--user:SMTP user @ domain:password
--insecure选项与我们之前看到的-k选项完全相同,用于忽略未知的SSL证书。
使用CURL发送HTTP POST,PUT,DELETE请求
除上述示例外,curl可用于将不同类型的HTTP请求方法发送到服务器。
如果要使用REST API配置应用程序,这将变得非常方便。
将介绍一些使用CURL发送REST API请求的示例。
使用CURL发送POST请求
如果我们使用CURL将请求发送到服务器而参数中没有任何请求方法选项,则默认情况下它将使用HTTP GET请求。
这是一个很好的行为。
但是在curl中使用-X选项,我们可以将所需的HTTP方法发送到服务器。
让我们看看POST请求。
$curl -X POST -u admin:admin http://example.com/myconfigs/status -Hcontent-type:application/xml -d @/home/user/file.xml
在上面的示例中,PUT是请求方法,-u用于提及访问服务器上特定资源的凭据,-H content-type是将要发送到服务器的内容格式的类型(可以是xml ,普通文字等)。
带有@/home/user/file.xml的-d表示将file.xml的内容发送到服务器。
该文件将包含URL http://example.com/myconfigs/status将接受的具有正确语法的配置选项。
发送PUT请求与上面显示的POST示例完全相同。
只需在上面的示例中将POST替换为PUT。
如果Web服务器不接受这些方法,我们将收到405错误作为答复。
HTTP 405表示服务器不接受该特定URL上的HTTP方法。
如果服务器不接受应用程序/xml格式,我们还可以获取HTTP不受支持的媒体类型错误作为答复。
不受支持的媒体类型的HTTP状态代码是415.
使用CURL将Cookie发送到服务器
CURL可用于使用先前获得的cookie将请求发送到服务器。
我们可以使用VALUE = DATA格式,也可以使用文件名作为参数,以便curl可以使用文件中的cookie数据作为输入。
我们还可以使用-c选项将从服务器获取的cookie保存到文件中,如下所示。
root@ubuntu1:~# curl -b mycookies.txt http://example.com
使用上面的命令,我们可以将保存在文件(本例中为mycookies.txt)中的cookie作为输入发送到服务器。
另外,我们也可以使用以下方法发送Cookie。
root@ubuntu1:~# curl -b "name=value" http://example.com
如果传递给-b开关的参数中没有=符号,则将其视为文件,应从中读取cookie作为输入(基本上是我们看到的先前方法)
使用CURL发送我们自己的HTTP标头
HTTP标头包含详细信息,以便服务器和客户端可以更好地相互理解。
标头包含太多信息。
其中一些在下面提到。
请注意,在修改user-agent的同时,我们确实看到了一个带有curl的标题修改。
Accept-Ranges: bytes Cache-Control: max-age=604800 Content-Type: text/html Date: Tue, 18 Mar 2014 15:42:32 GMT Etag: "359670651" Expires: Tue, 25 Mar 2014 15:42:32 GMT Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT Server: ECS (iad/19AB) X-Cache: HIT x-ec-custom-error: 1 Content-Length: 1270
服务器返回的所有以上显示的内容都是HTTP标头的一部分。
我们可以使用CURL修改HTTP请求标头。
尽管它的好功能是否不好需要进行认真的辩论,但是因为修改标头会欺骗接收请求的Web服务器。
因此,永远无法信任在标头中找到的数据。
让我们看看如何在发送请求时修改标头。
curl中的-H选项可用于修改标头。
我们可以修改我们希望的任何标题。
例如,让我们在请求中修改我们的Accept和Content-type标头。
root@ubuntu1:~# curl -H "Accept: application/xml" -H "Content-Type: application/xml" http://example.com
使用CURL验证SSL证书
我们看到了使用-k选项忽略SSL证书验证的方法。
但是,如果我们要验证服务器使用的证书,该怎么办。
在这种情况下,我们需要提供CA(证书颁发机构证书)才能curl。
这可以通过一个名为--cacert的简单命令行选项来完成。
root@ubuntu1:~# curl --cacert my-ca.crt https://example.com
根据文件修改时间下载文件
有时,如果我们在指定的时间后对其进行了修改,则只希望从URL下载文档。
这是curl中非常方便的选择。
它由curl中的-z选项完成,如下所示。
root@ubuntu1:~# curl -z 3-Jan-14 http://example.com/myfile.gz
上面的命令将下载文件myfile.gz(如果该文件在2014年1月3日之后进行了修改)。