curl 使用举例详解
十三、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
使用,你可以让curl
将cookie
存储到一个指定的位置(通常这个位置与cookies结合在一起使用)。这样,如果一个站点需要同时发送cookies
及其位置的话,你就可以使用并不存在的文件来激活cookie awareness
了,具体方法如下:
curl -L -b empty.txt www.example.com
被读取cookies
的文件必须是以经过格式化的HTTP头部的文件,或者是netscape
样式的cookie
文件。curl
可以自行判断该文件是基于何种形式进行存储的。在上面的命令中,curl
将会解析头部并存储从www.example.com收到的cookies
。curl
会根据指定的文件位置,向服务器发送经过存储的,并与其请求匹配的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