【每天一个Linux指令】cUrl

cUrl 介绍

cUrl:command line tool and library for transferring data with URLs

Everything cUrl 下载地址

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&amp;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
4
curl -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
18
TP/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
27
Connected 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
2
curl -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]

使用--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
2
curl -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