cUrl 介绍
cUrl:command line tool and library for transferring data with URLs
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。
cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
libcurl支持的平台有Solaris、NetBSD、FreeBSD、OpenBSD、Darwin、HP-UX、IRIX、AIX、Tru64、Linux、UnixWare、HURD、Windows、Symbian、Amiga、OS/2、BeOS、Mac OS X、Ultrix、QNX、BlackBerry Tablet OS、OpenVMS、RISC OS、Novell NetWare、DOS等。
cUrl 使用方法
1. 下载单个文件,默认将输出打印到标准输出(stdout)中(或者说:查看网页源码)
1 | curl http://www.baidu.com |
2. 通过 -o/-O 选项保存下载的文件到指定的文件中:(类似于 wget 功能)
-o:将文件保存为命令行中指定文件名的文件中
-O:使用 URL 中默认的文件名保存文件到本地
// 将文件下载到本地并命名为 java-files-io.html
curl -o java-files-io.html http://www.runoob.com/java/java-files-io.html
// 将文件下载到本地,使用 URL 中的文件名命名
curl -O http://www.runoob.com/java/java-files-io.html
同样可以使用重定向字符 “>” 对输出进行转向输出。
3. 同时获取多个文件
1 | curl -o file1.html URL1 -o file2.html URL2 |
若同时从同一站点下载多个文件时,curl会尝试重用链接(connection)。
4. 通过 -L 选项进行自动跳转
通过-L选项进行重定向
默认情况下CURL不会发送HTTP Location headers(重定向).当一个被请求页面移动到另一个站点时,会发送一个HTTP Loaction header作为请求,然后将请求重定向到新的地址上。
例如:访问google.com时,会自动将地址重定向到google.com.hk上。
curl http://www.google.com
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE>
</HEAD>
<BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.hk/?gfe_rd=cr&ei=F3VHWcDuHcvU8Afr-r-YAw">here</A>.
</BODY>
</HTML>
上述输出说明所请求的档案被转移到了http://www.google.com.hk。
这里可以使用 -L 选项进行重定向1
2## 让 curl 使用重定向地址,此时会查询 google.com.hk 站点
curl -L http://www.google.com
5. 断点续传
通过使用 -C 选项可对大文件使用断点续传功能,如:1
2
3
4
5
6## 当文件在下载完成之前结束该进程
curl -O http://www.runoob.com/java/java-files-io.html
###### 20.1%
## 通过添加 -C 选项继续对该文件进行下载,已经下载过的文件不会被重新下载
curl -C - -O http://www.runoob.com/java/java-files-io.html
6. 对 cUrl 使用网络限速
通过 –limit-rate 选项对 cUrl 的最大网络使用进行限制1
2## 下载速度最大不超过 1000B/s
curl --limit-rate 1000B -O http://www.runoob.com/java/java-files-io.html
7. 下载指定时间内修改过的文件
当下载一个文件时,可对该文件的最后修改日期进行判断,如果该文件在指定日期内修改过,就进行下载,否则不下载。
改功能可通过使用 -z 选项来实现:1
2## java-files-io.html 若在 2017-06-19 之后修改过才会进行下载
curl -z 19-June-17 http://www.runoob.com/java/java-files-io.html
8. HTTP认证
有些网域需要HTTP认证,这时curl需要用到--user
参数。1
2
3
4curl -u username:password URL
## 通常的做法是在命令行只输入用户名,之后会提示输入密码,这样可以保证在查看历史记录时不会将密码泄露
curl -u username URL
9. 显示头信息
-i 参数可以显示 http response 的头信息,连同网页代码一起1
curl -i www.sina.com
输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18TP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 19 Jun 2017 11:55:10 GMT
Content-Type: text/html
Location: http://www.sina.com.cn/
Expires: Mon, 19 Jun 2017 11:57:10 GMT
Cache-Control: max-age=120
Age: 64
Content-Length: 178
X-Cache: HIT from ctc.yongfeng.sinacache.181.nb.sinaedge.com.sina.com.cn
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
10. 显示通信过程
-v 参数可以显示一次 http 通信的过程,包括端口连接和 http request 头信息。1
curl -v www.sina.com
输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27Connected to www.sina.com (218.30.108.226) port 80 (#0)
> GET / HTTP/1.1
> Host: www.sina.com
> User-Agent: curl/7.53.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Mon, 19 Jun 2017 11:58:56 GMT
< Content-Type: text/html
< Location: http://www.sina.com.cn/
< Expires: Mon, 19 Jun 2017 12:00:56 GMT
< Cache-Control: max-age=120
< Age: 10
< Content-Length: 178
< X-Cache: HIT from ctc.yongfeng.sinacache.180.nb.sinaedge.com.sina.com.cn
<
0 178 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0{ [178 bytes data]
100 178 100 178 0 0 633 0 --:--:-- --:--:-- --:--:-- 671<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host www.sina.com left intact
如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。1
curl --trace output.txt URL
11. 发送表单信息
发送表单信息有GET和POST两种方法。GET方法相对简单,只要把数据附在网址后面就行。1
curl example.com/form.cgi?data=xxx
POST方法必须把数据和网址分开,curl就要用到–data参数。1
curl -X POST --data "data=xxx" example.com/form.cgi
如果你的数据没有经过表单编码,还可以让curl为你编码,参数是--data-urlencode
。1
curl -X POST--data-urlencode "date=April 1" example.com/form.cgi
12. HTTP动词
curl默认的HTTP动词是GET,使用-X
参数可以支持其他动词。1
2curl -X POST www.example.com
curl -X DELETE www.example.com
13. 文件上传
假定文件上传的表单是下面这样:1
2
3
4 <form method="POST" enctype='multipart/form-data' action="upload.cgi">
<input type=file name=upload>
<input type=submit name=press value="OK">
</form>
你可以用curl这样上传文件:1
curl --form upload=@localfilename --form press=OK [URL]
14. Referer字段
有时你需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的。1
curl --referer http://www.example.com http://www.example.com
15. User Agent字段
这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。
iPhone4的User Agent是1
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
curl可以这样模拟:1
curl --user-agent "[User Agent]" [URL]
16. cookie
使用--cookie
参数,可以让curl发送cookie。1
curl --cookie "name=xxx" www.example.com
至于具体的cookie的值,可以从http response头信息的Set-Cookie
字段中得到。
-c cookie-file
可以保存服务器返回的cookie到文件,-b cookie-file
可以使用这个文件作为cookie信息,进行后续的请求。1
2curl -c cookies http://example.com
curl -b cookies http://example.com
17. 增加头信息
有时需要在http request之中,自行增加一个头信息。--header
参数就可以起到这个作用。1
curl --header "Content-Type:application/json" http://example.com