感谢支持
我们一直在努力

curl 使用实例详解

一、最新版本

你可以在官网上了解到curl的开发的最新情况,并下载到最新版本的程序。

二、相对简单的用法

1、从Netscape的网页服务器上获得该网站的主页:

curl http://www.netscape.com/

2、从futnet的ftp服务器的用户主目录获得指定文件:README

curl ftp://ftp.funet.fi/README

3、使用服务器的8000端口获得web主页:

curl http://www.weirdserver.com:8000/

4、列出ftp站点目录中的文件:

curl ftp://cool.haxx.se/

5、从字典查询网站获得词条curl的定义:

curl dict://dict.org/m:curl

6、次性操作取得二份文档:

curl ftp://cool.haxx.se/ http://www.weirdserver.com:8080/

7、从FTPS服务器上获取文件:

curl ftps//files.are.secure.com/secrets.txt

或者使用推荐的方法访问FTPS服务器来执行相同的操作:

curl --ftp-ssl  ftp//files.are.secure.com/secrets.txt

8、使用SFTP从一个SSH服务器上获取一份文件:

curl -u username sftp://example.com/etc/issue

9、从一台使用私钥认证(私钥未使用密码保护)的SSH服务器上使用SCP获取一份文件:

curl -u username: --key ~/.ssh/id_rsa \
scp://example.com/~/file.txt

10、从一台使用私钥认证(私钥使用密码保护)的SSH服务器上使用SCP获取一份文件:

curl -u username: --key ~/.ssh/id_rsa --pass private_key_password \
scp://example.com/~/file.txt

11、从一台使用IPv6的网页服务器上获得站点主页:

curl "http://[2001:1890:1112:1::20]/"

12、从一台Samba文件服务器上获得文件:

curl -u "domain\username:passwd" smb://server.example.com/share/file.txt

三、下载文件

1、从网页服务器上下载一个web页面到当前目录中,并重新指定文件名:

curl -o thatpage.html http://www.netscape.com/

2、从网页服务器上下载一个文件存储到本地,但不重新指定文件名:

这种情况下,需要在URL中指定待下载的文件名,否则将下载失败

curl -O http://www.netscape.com/index.html

3、使用原文件名一次性从服务器上下载二份文件:

curl -O www.haxx.se/index.html -O curl.haxx.se/download.html

四、使用密码

1、FTP

对于ftp文件来说,应当加用户名和密码加入到URL地址中,用法如下:

curl ftp://name:passwd@machine.domain:port/full/path/to/file

或者使用参数-u来指定用户名和密码,用法如下:

curl -u name:passwd ftp://machine.domain:port/full/path/to/file

2、FTPS

FTPS使用密码的方式与FTP的用法很像,只不过是要指定参数--ftp-ssl来进行加密认证而已。
注意:使用FTPS://为前缀是以一种‘暗示’的对服务器进行访问标准方法;当然,你也可以使用‘明示’的方法,用FTP://前缀,配合参数--ftp-ssl使用。

3、SFTP/SCP

FTP使用方法类似,但是你需要使用参数--key来指定私钥文件来代替系统密码。需要注意的是,私钥文件本身也可以使用密码进行保护,但这个密码并不是远程服务器的登录密码。私钥文件本身的密码需要通过参数--pass来进行指定。一般情况一下,curl会自动地从私钥文件中提取公钥,但是curl在没有适当的目录支持的情况下,则必须使用参数--plukey来指定与私钥匹配的公钥文件。

4、HTTP

Curl同样支持在HTTP``URL中使用用户名和密码,因此你可以使用下面的方法从服务上获取文件:

curl http://name:passwd@machine.domain/full/path/to/file

或者另行使用参数来指定用户名和密码:

curl -u name:passwd http://machine.domain/full/path/to/file

在HTTP提供的诸多认证方式中,curl支持下列认证:Basic, Digest, NTLMNegotiate (SPNEGO)。在未指定任何认证方式的情况下,curl默认使用Basic。你可以通过使用‘–anyauth’来告诉curl使用何种服务器能够接受的加密方式来访问指定的URL地址。
注意:根据URL的要求,HTTP URLs是不能包含用户名和密码的。因此curl在使用代理的情况下是无法以这种方式正常工作的,即使curl有时候是允许这样操作的。当使用代理的情况下,你必须使用参数-u来指定用户和密码。

5、HTTPS

HTTPS可能是私钥认证最觉的方式,具体内容见下文。

五、代理

curl同时支持HTTPSOCKS代理服务器,并且可以指定适当的认证方式。因为没有相应的标准,所以curl并没有对FTP代理服务器进行特殊的设置,但是curl也可以大部分的FTP代理服务器下正常工作。你可以使用HTTP或者SOCKS代理从FTp服务器上下载和上传文件。

1、使用名为my-proxyHTTP代理服务器,通过888端口,从一台FTP服务器上下载指定文件:

curl -x my-proxy:888 ftp://ftp.leachsite.com/README

2、使用上面的代理服务器,通过用户名和密码从指定的HTTP服务器上下载文件:

curl -u user:passwd -x my-proxy:888 http://www.get.this/

3、一些代理服务器要求指定认证方式。所以上面的命令需要将-u改为-U

curl -U user:passwd -x my-proxy:888 http://www.get.this/

4、用逗号分隔的主机或者域名列表中,如果有不使用代理服务器的,应如下指定:

curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/

5、如果使用--proxy1.0代替--proxy或者-x来指定代理服务器的工作协议,那么curl将使用HTTP/1.0代替 HTTP/1.1来尝试进行任何连接。

6、curl使用参数--socks4--socks5来支持SOCKS4SOCKS5代理

可以参见Curl所支持的环境变更,来针对代理服务进行高级设置。

7、从FTP客户端的角度来看,大部分的FTP代理服务器都被设置为类似于普通的FTP服务器,这些服务器需要通过特殊的命令来选择远程服务器。

curl支持使用-u,-Q--ftp-account选项来设置通过大多数FTP代理来文件远程服务器。
举例:使用相关参数,通过FTP代理服务器,向远程FTP服务器上传一份文件:

curl -u "Remote-FTP-Username@remote.ftp.server Proxy-Username:Remote-Pass" \
--ftp-account Proxy-Password --upload-file local-file \ 
ftp://my-ftp.proxy.server:21/remote/upload/path/

查看你的FTP代理服务器手册来设置与之匹配的文件传输,并使用curl-v选项来查看curl的传输内容。

六、范围

HTTP 1.1引入了字节范围。通过这个功能,客户端可以要求只获取一个指定文件的一部分内容。curl通过参数-r来支持此功能。
1、获取一份文件的前100个字节:

curl -r 0-99 http://www.get.this/

2、获取一份文件最后500个字节:

curl -r -500 http://www.get.this/

3、Curl同时也支持下载FTP服务器上的文件的一定范围内的内容.

你可以指定文件的开始和结束的位置。
FTP服务器上获取一份文件的前100个字节的内容:

curl -r 0-99 ftp://www.get.this/README

七、上传

(一)、FTP / FTPS / SFTP / SCP

1、上传标准输入的所有数据到指定服务器:

curl -T - ftp://ftp.upload.com/myfile

2、使用用户名和密码,上传指定文件到服务器上(在URL中指定远程文件名称):

curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile

3、将本地文件上传到远程站点,远程服务器上的文件使用与本地文件相同的文件名:

curl -T uploadfile -u user:passwd ftp://ftp.upload.com/

4、将待上传的文件追加指定的远程文件之后:

curl -T localfile -a ftp://ftp.upload.com/remotefile

5、curl也支持使用代理来完成文件上传到ftp,但是只有在代理服务器已经被配置为允许此类型的通道时才可以完成传输。如果代理服务器支持话,你就可以使用与下面命令类似的命令来完成文件的上传:

curl --proxytunnel -x proxy:port -T localfile ftp.upload.com

(二)、SMB / SMBS

curl -T file.txt -u "domain\username:passwd" smb://server.example.com/share/

(三)、HTTP

**上传标准输入的所有数据到指定的HTTP站点:

curl -T - http://www.upload.com/myfile

注意:HTTP服务器必须被事先配置为接受PUT, 上述命令才能被成功的执行。
对于HTTP数据上传的其他方式,请参见POST的相关内容。

八、VERBOSE / DEBUG

如果curl没有按照预想的方式运行,或者服务器拒绝你的访问,再或者你根本看不懂反馈信息,请使用参数-v 来获取完成的运行信息。curl将输出大量的发送和接收信息,来让用户查看所有的客户端和服务器的交互内容,但它并不会显示你的真实数据。

curl -v ftp://ftp.upload.com/

如果还想从curl获得更为详尽的信息,请尝试使用参数--trace或者--trace-ascii 同时指定日志文件的名称:

curl --trace trace.txt www.haxx.se

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2017-12/149659p2.htm

九、详细信息

不同的网络协议会提供获取特定文件或者文档详细信息不用的方法。想让curl显示单个文件的详细信息,你应该使用参数-I或者--head。使用该参数,执行结果将显示单个文档基于HTTP和FTP的所有可用信息。如果文档是基于HTTP的话,会有大量的信息可供查阅。

基于HTTP, 你可以使用-i或者--include获取文档实际数据之前的header信息(这部分内容与使用-I参数得出的header信息应该是一致的)。当你从FTP或者HTTP上获取文件时,可以使用参数-D或者--dump-header,这样curl就可以将文件的header信息保存到指定的文件里了。

下面举例说明,将HTTPheader存储到指定文件的方法,以header.txt文件为例:

curl --dump-header headers.txt curl.haxx.se

注意:header信息存储到指定的文件中对于你想使用curl向服务器发送cookes是一种非常有用的方法。更多内容请参见cookies小节。

十、POST (HTTP)

使用curl提交数据(post data)是非常容易的, 具体的方法就是使用参数-d <data>。待提交的数据必须经过urlencoded

修改一个简单的由姓名电话组成的留言本。

curl -d "name=Rafael%20Sagula&phone=3320780" \ 
http://www.where.com/guest.cgi

**举例说明怎样通过使用curl来提交一个表单:
在你想要填写的表单中找出所有的<input>标签,在curl的官网上有一个名叫formfind.plperl程序可以帮助你快速完成这一步骤。

如果这是一次“常规”的提交,你可以使得参数-d来完成提交。-d将会使用如下格式提交一份完成的”提交字符(post string)”:

<variable1>=<data1>&<variable2>=<data2>&...

变量(variable)是你在<input>标签中找到的表单项,如“name”; 而=后面的数据(data)就是你要在该表单项下填写的内容,但是注意这里的数据必须是经过URL编码的。这就意味着,你需要将空格替换成+, 而将字母替换为%XX,其中的XX的以十六进制表示的ASCII编码的字符。

举例说明:

表单页面为:

<form action="post.cgi" method="post">
    <input name=user size=10>
    <input name=pass type=password size=10>
    <input name=id type=hidden value="blablabla">
    <input name=ding value="submit">
</form>

我们在这表单中想输入用户为:foobar, 密码为:123456
要提供这份表单,你需要输入下面的curl命令:

curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" http://www.formpost.com/getthis/post.cgi

当使用参数-d时mime类型application/x-www-form-urlencoded通常会被CGI或者类似的接口所接受,curl同时还支持功能更强的multipart/form-data类型,后者提供诸如文件上传的功能。

-F接受-F "name=contents"形式的参数。如果你想从文件中读取表单的数据内容,可以使用<@filename>的形式来指定文件名。如果在指定文件的的同时,你还能指定文件的类型,那可以在文件名后面追加内容;type=<mime type>。你也在一个表单项中一次提交多份文件。
例如,使用名为’coolfiles’表单项用于提交三份类型不同的文件,应该使用如下的命令行格式:

curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \ 
http://www.post.com/postit.cgi

如果文件的类型没有被指定,那么curl将会从文件的扩展名来判断文件的类型(其支持扩展名各类比较少),或者前面指定过文件类型的文件来判断(多个文件被指定在一个文件列表中),如果以上方法都不行的话,curl就会使用默认的类型application/octet-stream.

使用-F参数还填写一个有三个表单项的表单。三个表单项分别为:待提交的文件名、你的姓名和文件描述。待提交的文件名为cooltext.txt。使用curl来代替你常用的浏览器来提交表单,你必须从HTML源代码来读取表单,并找出待输入的表单项名称。在此例中,输入的表单项的名称分别为:fileyournamefiledscription.

curl -F "file=@cooltext.txt" -F "yourname=Daniel" -F "filedescription=Cool text file with cool text inside" http://www.post.com/postit.cgi

想要在一次提交操作中上传二份文件,你需要使用如下二种方式之一:
1、在一个表单项中,填入多个文件:

curl -F pictures=@dog.gif,cat.gif

2、 使用二个表单项,分别填入一个文件:

curl -F "docpicture=@dog.gif" -F catpicture=@cat.gif

如果只是发送表单项的字面值(文件名),而不是发送实际文件,就不需要使用前缀@,<或者嵌入;type=, 这时推荐使用--form-string来代替-F。 特别是不能确定用户来源的情况下,使用-F来代替--form-string,将会使用户有机会欺骗curl来进行文件上传操作。

十一、REFERRER

一个HTTP请求应该包含跳转到当前有页面之前的页面的地址信息。curl允许你使用命令行来指定一个referrer。这对于欺骗依赖于特定信息的服务器程序或者CGI脚本来说是非常用的功能。

curl -e www.coolsite.com http://www.showme.com/

定义: referrer 属性可返回载入当前文档的文档的 URL。

十二、USER AGENT

一个HTTP请求应该包含生成该请求的浏览器的相关信息。curl允许你使用命令行来指定一个浏览器。 这对于只接受特定浏览器请求的服务器或者CGI脚本来说是非常有用的功能。
举例说明:

curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/

其他表示浏览器的字符串如下:

字符串 浏览器
‘Mozilla/3.0 (Win95; I)’ Netscape Version 3 for Windows 95
‘Mozilla/3.04 (Win95; U)’ Netscape Version 3 for Windows 95
‘Mozilla/2.02 (OS/2; U)’ Netscape Version 2 for OS/2
‘Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)’ NS for AIX
‘Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)’ NS for Linux

表示Internet Explorer如下,但由于兼容性问题,不是每一次尝试都能成功:

字符串 浏览器
‘Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)’ MSIE FOR W95

Mozilla以外的浏览器类型:

字符串 浏览��
‘Konqueror/1.0’ KDE File Manager desktop client
‘Lynx/2.7.1 libwww-FM/2.14’ Lynx command line browse

十三、COOKIES

Cookies一般用于在Web服务端保持客户端的状态信息。服务器会通过在网页的头信息中加入一行来发送cookes,其内容如Set-Cookie: <data>, 其中data部分的值通常包含一系列的NAME=VALUE的值,多个值之间用分号;隔开,如”NAME1=VALUE1; NAME2=VALUE2;”。服务器还可以通过设置path=value来指定cookies值的路径,cookies何时过期(expire=DATE),使用什么域名(domain=NAME)以及是否应该在安全的连接下来使用cookies(secure)。

如果你从服务器收到一个页面,其头部中包含如下内容:

Set-Cookie: sessionid=boo123; path="/foo";

这就意味着在我们想从以/foo开始的路径获取相关信息的时间,服务器需要取得的第一个赋值对

例如,一个页面想要从一个cookie中获取我的姓名, 使用curl,应输入如下命令:

curl -b "name=Daniel" www.sillypage.com

curl也可以使用在之前的会话收到的cookies。如果你想从服务器获取cookies并将他们保存到本地的一个文件中,应该使用如下的命令:

curl --dump-header headers www.example.com

然后你就可以使用从页面头部获得的cookies,再次连接这个站点或者其他站点了:

curl -b headers www.example.com

虽然能过将页面的头部存储到本地文件中来实现cookies的存储是一个有效的方法,但是因为容易出错,所以我们不推荐使用这种方法来进行相关操作。取而代之的方法是使用curl将取回的cookies以众所周知的netscape cookie的格式进行保存,具体方法如下:

curl -c cookies.txt www.example.com

需要注意的是,通过使用-b你可以开启cookie awareness, 同时配合 -L使用,你可以让curlcookie存储到一个指定的位置(通常这个位置与cookies结合在一起使用)。这样,如果一个站点需要同时发送cookies及其位置的话,你就可以使用并不存在的文件来激活cookie awareness了,具体方法如下:

curl -L -b empty.txt www.example.com

被读取cookies的文件必须是以经过格式化的HTTP头部的文件,或者是netscape样式的cookie文件。curl可以自行判断该文件是基于何种形式进行存储的。在上面的命令中,curl将会解析头部并存储从www.example.com收到的cookiescurl会根据指定的文件位置,向服务器发送经过存储的,并与其请求匹配的cookies。文件empty.txt很有可能并不存在。

读写一个netscape cookie文件,你可以同时对同一个文件使用参数-b-c

curl -b cookies.txt -c cookies.txt www.example.com

十四、处理进度

处理进度将会显示给用户在实现操作中发生了什么事情。其输出的各字段如下:

% Total    % Received % Xferd  Average Speed               Time            Curr.
                               Dload   Upload    Total    Current  Left    Speed
0  151M    0 38608    0     0   9406      0      4:41:43  0:00:04  4:41:39  9287

从左至右各字段为:

字段 含义
% 整体传输完成百分比
Total 整体传输的大小
% 下载完成百分比
Received 当前已下载的字节数
% 上传完成百分比
Xferd 当前已上传的字节数
Average Speed Dload 平均下载速度
Average Speed Upload 平均上传速度
Time Total 预计完成全部传输所需的时间
Time Current 当前所消耗的时间
Time Left 预计完成剩余传输所需的时间
Curr.Speed 最近5秒内平均传输速度(传输最开始5秒,该值是基于线路理论上的速度来计算的)

使用参数-# 将会显示一个完全不同的进度条,这里就不做过多的解释了。

十五、限速

curl允许用户设置传输速度条件以保证网络传输持续进行。通过使用-y-Y这二个开关,你可以让curl在特定时间周期内,如果传输速度在设置的最低值以下,则忽略数据传输。

如果想让curl在最近一分钟内,传输速度低于3000字节/秒的情况下,忽略数据下载,应执行如下命令:

curl -Y 3000 -y 60 www.far-away-site.com

使用下面的例子通过很好的将时间条件进行组合,来将上一条命令实现为整个操作必须在30分钟内处理完成:

curl -m 1800 -Y 3000 -y 60 www.far-away-site.com

强制curl在传输数据时不要超过一个给定的速率也是可以实现的,此操作尤其是在你不想让curl的数据传输占据你全部的网络带宽的情况下是非常有用的,使用起来就好像是一个带宽的调节器一样。

curl的数据传输速度限制为10K/s应执行:

curl --limit-rate 10K www.far-away-site.com

或者:

curl --limit-rate 10240 www.far-away-site.com

curl的数据上传速度限制为1Mb/s应执行:

curl -T upload --limit-rate 1M ftp://uploadshereplease.com

当使用参数--limit-reate时,传输速度通常是以秒为单位,会导致整体的传输速度低于给定的数值。有个别时候,如果你的网络传输出现延迟的情况下,传输的速度会非常的慢。

十六、配置文件

curl会在程序启动时会自动尝试读取用户家目录中的.curlrc文件,如果在win32系统下配置文件名为_curlrc

配置文件可以使用普通的命令行开关组成,但是你也可以指定长选项来代替破折号来增加配置文件的可读性。你可以使用空格=或者:来分隔参数及其值。配置文件中也可以使用注释。通过将每一行首字符设置成#,来完成单行的注释。

如果你希望参数中包含空格的话,你可以使用双引号"将整个参数括起来。如果在双引呈里如果还要输入一个双引号,可以使用\"的形式。

注意:你配置在一行之内完成参数的赋值。

例如:在配置文件中设置默认的连接超时和代理

# We want a 30 minute timeout:
        -m 1800
# ... and we use a proxy for all accesses:
        proxy = proxy.our.domain.com:8080

白空格符号ARE会出现在每一行的未必,但是所有以白空格做为首字符的行,都将被忽略。

通过将参数-q放到curl命令行的第一个参数的位置,可以阻止curl读取默认的配置文件:

curl -q www.thatsite.com

在没有可以使用的URL的情况下,如果想让curl获取和显示本地帮助页面,就应该按如下方式设定配置文件:

# default url to get
        url = "http://help.with.curl.com/curlhelp.html"

你也可以给用参数-k或者--config来给curl指定其他的配置文件。如果你将配置文件的文件名设置为”-“, 那么curl就会从标准输入里读取配置文件,这样你就可以手工处理一些需要隐藏的选项了:

echo "user = user:passwd" | curl -K - http://that.secret.site.com

十七、附加头部(EXTRA HEADERS)

当你在自己特殊的程序中使用curl时, 你可以需要在获取web页面时在最后加入自定义的头部信息。你可以使用参数-H来完成这一操作。

例如,当获取一个页面的时候将头部信息 “X-you-and-me: yes”发送到服务器:

curl -H "X-you-and-me: yes" www.love.com

这在你想将不同的文本做为html头部发送给服务器的情况下十分有用。curl将使用-H指定的html头部将代替默认的html头部来进行发送。如果你将头部信息中的相关值赋成空值,那个你将阻止该项头部信息的发送。如阻止发送主机名(Host):

curl -H "Host:" www.server.com

十八、FTP的路径和文件名

需要强调的当从一个以ftp://开头的URL地址下获取文件的时候,给定的路径是与你进入的目录有相关的。如,从你的ftp站点的家目录中获取README,你需要执行:

curl ftp://user:passwd@my.site.com/README

但如果你想要从同一个站点的根目录中获取README文件的话,你就需要指定文件的绝对路径了:

curl ftp://user:passwd@my.site.com//README

在文件名之前多了一个额外的/

十九、SFTP和SCP的路径和文件名

对于sftp:scp:的URL来说,给定的路径和文件名都表示为在服务器上的绝对路径和文件名。对一个文件的访问与远程用户的家目录相关,在文件名上需要加上前缀/~/,例如:

curl -u $USER sftp://home.example.com/~/.bashrc

二十、FTP和防火墙

FTP协议要求在数据传输开始的同时再开放一条额外的连接给客户端。有二种方式可以完成这一操作

curl默认的方式是使用PASV命令让服务器再开放另一个端口等待已经连接的客户端来主动连接这一端口。对于客户端位于防火墙之后 ,而该防火墙不允许ftp通过防火墙主动连接客户端的情况,是非常好的解决方法。

curl ftp.download.com

对于如果ftp服务器也位于防火墙之后,该防火墙也不允许客户端主动连接除21端口之外的其他端口情况,又或者服务器根本就不支持PASV命令,这时就需要使用另一种方式:使用PORT命令,并通知服务器使用通过参数指定给PORT命令的IP和端口来主动连接客户端。

curl-P参数支持一些不同的选择。你的主机可能拥有多个IP地址或者多块网卡, curl允许你从它们当中进行选择。
使用默认的IP地址进行连接:

curl -P - ftp.download.com

使用le0网卡的IP地址,通过端口进行下载(windows不适用):

curl -P le0 ftp.download.com

使用IP地址:192.168.0.10 通过商品进行下载:

curl -P 192.168.0.10 ftp.download.com

二十一、网络适配器

使用指定的网卡,从服务器上获取一个web页面:

curl --interface eth0:1 http://www.netscape.com/

或者:

curl --interface 192.168.1.10 http://www.netscape.com/

二十二、HTTPS

使用安全的HTTP要求在编译curl之前完成SSL库的安装。如果按此操作,curl就具备了使用HTTPS协议进行获取和提交文档的能力了。
例如:

curl https://www.secure-site.com

curl还可以在要求使用证书认证的网站上使用你个人的证书来完成获取/提交的操作。唯一的缺点是证书需要用符合PEM格式(PEM-format)。PEM是用来存储证书的标准和开放的格式,但它不被大部分主流浏览器所使用(Netscape和MSIE使用的是被称为PKCS#12的格式)。如果你想让curl使用你最常用的浏览器所使用的证书,你需先下载和编译一个针对你浏览器证书格式的转换器,然后将你的浏览器证书转换成PEM格式。该转换器包含在最新版本的OpenSSL软件包中,对于之前版本的OpenSSL软件包Stephen
N. Henson博士已经编写了一个针对SSLeay的补丁来增加该功能。你可以从下面的网址获得该补丁,前提是要求先安装SSLeay:
http://www.drh-consultancy.demon.co.uk/

下面举例说明如何使用带有密码的个人证书来自动获取一份文档:

curl -E /path/to/cert.pem:password https://secure.site.com/

如果你忘记在命令行中指定证书的密码,程序将会在获取任何数据之前,提示你输入密码。

许多老版本的SSL服务器在使用新版本OpenSSL所使用的SSLv3或者TLS时会出现问题,因此有时为curl指定所需要使用的SSL版本是非常有用的方法。使用-3, -2或者-1(分别代表 SSLv3,SSLv2或者SSLv1)来精确指定curl所使用的SSL版本:

curl -2 https://secure.site.com/

除此之外,curl也会首先尝试使用v3,然后再使用v2

使用OpenSSL来将你常用的浏览器证书转换成curl可以使用的PEN格式的证书,你需要如下操作:
– 在Netscape中,你单击“安全”菜单按钮;
– 选择“证书 -> 你的证书”,然后在列表中选择一份证书;
– 单击“导出”按钮;
– 输入你的证书的PIN码;
– 为你的证书选择一个存储位置;
– 运行openssl程序进行证书转换。如果已经切换到openssl的安装目录,你可以执行如下命令:

# ./apps/openssl pkcs12 -in [file you saved] -clcerts -out [PEMfile]

对于Firefox进行如下操作:选择“选项”,然后“高级”,然后选择“加密”标签,查看证书。这时会打开证书管理器,你在其中可以进行证书的导出操作。但是要确保选择PEM做为证书的导出类型。

对于MSIE进行如下操作:选择“Internet选项“,然后选择”内容“标签,然后选择”证书“。接下来,你就以可以转换为PEM格式的证书类型的将证书进行导出操作。

对于Chrome进行如下操作:选择”设置“,然后选择”显示高级设置“。在HTTPS/SSL下选择证书管理。

二十三、文件续传

对于文件的断点续传,curl支持HTTP(S)下载续传和FTP上传/下载续传。

下载续传一份文件:

curl -C - -o file ftp://ftp.server.com/path/file

上传续传一份文件(此功能要求FTP服务器支持非标准命令:SIZE。如果不支持,curl会进行告知。)

curl -C - -T file ftp://ftp.server.com/path/file

从web服务器下载续传一份文件(此功能要求web服务器最少支持HTTP/1.1.如果不支持,curl会进行告知。)

curl -C - -o file http://www.server.com/

二十四、时间条件

HTTP允许客户端根据文档的要求指定一个时间条件。这个条件就是“如果-被修改-自从”或者“如果-未被修改-自从”。curl允许你通过参数-z或者--time-cond 来指定条件。

例如你可以很张轻松的完成诸如如果服务器上的文件的修改日期比本地文件复本的新就进行下载这样的操作,具体方法如下:

curl -z local.html http://remote.server.com/remote.html

或者,你也可以反过来,在本地文件的修改日期比服务器上的文件新时,才下载。要实现这个操作,只需要在日期字符串的前面加上一个-即可:

curl -z -local.html http://remote.server.com/remote.html

你也可以指定一个任意的日期文本做为条件。告诉curl只从服务器上下载在2012-1-12之后(包含该日期)更新的文件:

curl -z "Jan 12 2012" http://remote.server.com/remote.html

curl也可以接受一个日期范围。你也可以使用加入-的方法来进行日期条件的设置。

二十五、DICT

先尝试几个有趣的命令:

curl dict://dict.org/m:curl
curl dict://dict.org/d:heisenbug:jargon
curl dict://dict.org/d:daniel:web1913

别名m的意思是匹配(match)并查找(find),而别名d是定义(define)并查找(lookup)的意思。
例如:

curl dict://dict.org/find:curl

命令是使用RFC来描述URL的,但并不是DICT协议:

curl dict://dict.org/show:db
curl dict://dict.org/show:strat

操作这些操作是不需要认证,RFC本身也没有要求进行认证。

二十六、LDAP

如果你已经安装了OpenLDAP库,那么curl就可以对ldap://提供更为高级的支持了。

在Windows系统上, curl将默认使用平台提供的WinLDAP。

curl默认使用的协议版本为LDAPv3。只有在使用LDAPv3连接失败的情况下,才会降级使用LDAPv2

LDAP是一个复杂的东西,要写一个LDAP请求也不是一项轻松的任务。我强烈建议你从其他 什么地方查找相关的格式描述。其中一个存放地址如下:

RFC 2255, "The LDAP URL Format" https://curl.haxx.se/rfc/rfc2255.txt

这里举个例子,看看我是如何从我本地的LDAP服务器上获取所有人的,当然这个服务器有一个确定的子域名,这个子域名包含在电子邮件地址中:

curl -B ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se

如果我想得到HTML格式的相同信息的话,只需要去掉参数-B(强制ASCII)即可。

你也可以在访问LDAP目录的时候使用认证:

curl -u user:passwd "ldap://ldap.frontec.se/o=frontec??sub?mail=*"
curl "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*"

默认的情况下,如果提供了用户名和密码,OpenLDAP/WinLDAP将会使用基本的认证方式进行认证。在Windows上,你可以通过向curl命令行提供下列参数之一来实现这一控制:--baisc, --ntlmdigest.
By default, if user and password provided, OpenLDAP/WinLDAP will use basic

curl --ntlm ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*

在Windows上,如果没有提供用户名和密码,将会自动使用当前登录的帐户认证信息(SSPI/SPNEGO)来进行认证。

二十七、环境变量

curl 能读取和理解下面这些环境变量:

http_proxy, HTTPS_PROXY, FTP_PROXY

这些变更应该被设置为协议指定的代理。

通常代理应该设置为:ALL_PROXY

如果限定一个以逗号分隔的主机列表中(,*则匹配所有主机)的所有主机都不可以通过任何代理服务器,则应该被设置为:NO_PROXY

如果主机名配置其中任何一个字符串,或者主机在其中任何一个字符串所包含的域中,这些节点将不能通过代理进行交互。当一个域被使用时,这需要先启动一段时间。用户可以通过对.example.com这个域名设置NO_PROXY来使www.example.comfoo.example.com这二个主机不能使用代理。通过使用主机全名你可以排除特定的主机名,针对 www.example.com设置NO_PROXY,就可以在禁止www.example.com使用代理的情况下,而仍旧可以让foo.example.com使用代理。

通过使用参数-x或者--proxy可以重写环境变量。

二十八、NETRC

Unix在很久以前就引入了.netrc的概念。其提供了一个方法让用户可以在一个文件中为经常需要访问的FTP站点指定用户名和密码,这样你在访问这些站点的时,就不需要每次都输入用户名和密码了。你应该已经意识到:如果其他人得到了你的密码,这将面临巨大的安全隐患,因此,除非只有你自己有可读权限外,大多数unix程序都不会读取这些文件。然而curl不会关心这些安全问题。

curl就可以支持通过参数-n/--netrc--netrc-optional来指定.netrc文件。而且不只是限定在FTP上使用,所以curl可以在需要认证的地方,针对所有协议使用这些文件。

一个非常简单的.netrc文件的内容,看起来应该是这样的:

machine curl.haxx.se login iamdaniel password mysecret

二十九、自定义输出

为了可以更好的让角本程序员了解关于curl的运行情况的相关信息,在这里引入了参数-w/--write-out。使用这些参数,你可以指定从上一次传输中提取你想要得到的信息。

要在完成传输后,另起一行,显示此次传输下载的总字节数,你需要使用如下的命令:

curl -w 'We downloaded %{size_download} bytes\n' www.download.com

三十、KERBEROS FTP传输

curl支持将kerberos4kerberos5/GSSAPI用于FTP传输。你需要在编译curl之前,完成kerberos软件的安装。
首先,通过常规方法获取krb-ticket, 比如使用kinit/kauth工具。
然后,通过以下的方法使用curl:

curl --krb private ftp://krb4site.com -u username:fakepwd

这里没有使用-u开关来指定密码,但是curl会提示你输入在使用kinit/kauth工具创建krb-ticket时所设置的密码。

三十一、TELNET

curl只支持基本的、非常简单的telnert操作。curl将标准输入的内容全部发送到远程服务器。连接到远程telnet服务器使用以下命令:

curl telnet://remote.server.com

然后将在标准输入中输入的数据传送至服务器。执行结果将被发送至标准输出,如果你希望将执行结果保存至文件,请使用参数-o

针对低速网络连接等情况,你也许通过参数-N/--no-buffer来关闭输出缓存。

通过使用参数-t,可以向telnet传送协议允许的选项。如果我们想告知服务器将使用vt100终端 来进行连接,应输入如下命令:

curl -tTTYPE=vt100 telnet://remote.server.com

对于-t, 其他有趣的选项还包括:
– XDISPLOC= 设置X的显示的位置。
– NEW_ENV=

三十二、持久连接

在一个命令中进行多个文件将会让curl按命令中指定的文件顺序一个接一个的传输所有的文件。

libcurl将会尝试使用持久连接来传输全部文件,这样第二个文件也可以使用已经完成初始化并仍旧对前一次传输开放的同一连接来进行传输。这样将大幅度减少传输全部文件所需的连接次数,对于网络的合理使用也大有好处。

注意:curl本身对于传输并不使用持久连接,传输的持久连接只是curl在随后发起的库调用。尽可能多的在一个命令行中使用大量的URL向同一服务器传输文件,这会里整体的传输速度变得更快。实际 上,如果你使用HTTP代理来传输文件,你就会发现所有的传输使用的都是持久连接。

三十三、单条命令行下的多路传输

根据上面内容提到的方法,通过简单的添加多个URL,你可以在一个命令中下载多个文件。如果你希望将这些文件存储到本地文件中而不是打印输出至标准输出的话,你需要针对每个URL指定选项-O(而不需要使用--remote-name-all)

例如:下载二个文件,对第一文件使用-O,并自定义第二文件的文件名:

curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg

你可以使用相似的模式来上传多个文件:

curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt

三十四、IPv6

当使用IPv4进行连接失败,并且服务器返回的是一个IPv6地址的情况下,curl将使用IPv6连接服务器。 选项--ipv4--ipv6,可以在这二种地址都可用时指定使用哪种地址进行连接。IPv6地址还可以在URL中直接进行指定,具体方法如下:

http://[2001:1890:1112:1::20]/overview.html

使用这种格式时,必须同时指定选项-g,否则curl将认为[]是全局字符,而导入停止执行命令。
本地链接和本地站点地址包含一个标识符范围,如fe80::1234%1,这些标识符也有可能被用到,但是其中一部分必须是数字或者匹配在linux系统中已经存在的网络适配器,并且百分号必须被URL转义。上一个例子中内容转换成SFTP URL将会是下面的样子:

sftp://[fe80::1234%251]/

IPv6地址在URL以外提供的选项不应该编码为URL,如:--proxy, --interface--ftp-port

用于Curl问题反馈和改进的邮件列表

为了方便讨论curl、软件的开发以及与其相关的事宜,我们为您开放一了些邮件列表。你可以在如下网址获得相关信息https://curl.haxx.se/mail/。其中一些邮件列表为:

  • curl-users:

针对命令行工具的用户。讨论的内容包括:如何使用curl,软件工作异常,新功能,相关工具,使用中遇到的问题,新闻,安装,编译,运行,端口等等。

  • curl-library

开发者使用或者开发libcurl,包括:Bugs,扩展,改进。
– curl-announce

邮件量很少。只接受公布新版本的通知。最多每月发送一至二封邮件,通常情况下,每二个月只发送一封邮件。

  • curl-and-php

curl的函数应用于PHP, 包括所有curlPHP相关的内容。

  • curl-and-Python

用于反馈Python骇客在绑定pycurl的情况下,无论是否在python环境下使用curl遇到的问题。

请直接反馈curl的问题,功能性要求和故障报告到以上邮件列表中,而不要发送私人邮件。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149659.htm

赞(0) 打赏
转载请注明出处:服务器评测 » curl 使用实例详解
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏