二十五、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
, --ntlm
和 digest
.
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.com
和foo.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
支持将kerberos4
和kerberos5
/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
。
三十五、METALINK
curl
支持Metalink
,包括version 3 和 4 (RFC 5854),一种可以列出多个URI
资源并针对文件可以进行hash
的方法。
如果出现无法获取文件或者无法连接服务器等错误,curl
将会把备用资源列表中资源做为镜像来使用。并且在下载完成之后,还会对文件进行hash
校验。Metalink
文件会在内存中完成上述的下载和处理工作,并不会将它们存储的本地文件系统中。
例如使用远程Metalink
文件:
curl --metalink http://www.example.com/example.metalink
使用文件传输协议(file://)来使用本地文件系统中的Metalink
文件:
curl --metalink file://example.metalink
请注意如果文件传输协议被禁用,就不能在写入时,使用本地Metalink
文件。同样需要注意的是,如果--metalink
和--include
同时被使用,--include
将会被忽略。这是因为在应过其中中包含头部信息将会破坏Metalink
分析器,同时如果头部信息被包含在一个被描述为Metalink
的文件中,也会导致hash
检测失败。
用于Curl问题反馈和改进的邮件列表
为了方便讨论curl
、软件的开发以及与其相关的事宜,我们为您开放一了些邮件列表。你可以在如下网址获得相关信息https://curl.haxx.se/mail/。其中一些邮件列表为:
- curl-users:
针对命令行工具的用户。讨论的内容包括:如何使用curl,软件工作异常,新功能,相关工具,使用中遇到的问题,新闻,安装,编译,运行,端口等等。
- curl-library
开发者使用或者开发libcurl
,包括:Bugs,扩展,改进。
- curl-announce
邮件量很少。只接受公布新版本的通知。最多每月发送一至二封邮件,通常情况下,每二个月只发送一封邮件。
- curl-and-php
将curl
的函数应用于PHP
, 包括所有curl
与PHP
相关的内容。
- curl-and-python
用于反馈Python骇客在绑定pycurl的情况下,无论是否在python环境下使用curl遇到的问题。
请直接反馈curl
的问题,功能性要求和故障报告到以上邮件列表中,而不要发送私人邮件。