cURL 是一个软件包,由命令行工具和库组成,用于使用 URL 语法进行数据传输。
cURL 支持各种协议,如:
DICT
FILE
FTP
FTPS
Gopher
HTTP
HTTPS
IMAP
IMAPS
LDAP
LDAPS
POP3
POP3S
RTMP
RTSP
SCP
SFTP
SMTP
SMTPS
Telnet
TFTP
〇、涉及到的命令
行为 ----------------------------------------------------------------
-G, --get ........................... 将参数以 GET 方式请求
-I, --head .......................... 相当于 HTTP HEAD 方法
-o, --output ........................ 下载到指定文件名
-O, --remote-name ................... 下载到默认文件名
-X, --request ....................... 指定请求方法
传输控制 -------------------------------------------------------------
-C, --continue-at ................... 断点续传
--limit-rate ........................ 限速
-L, --location ...................... 遵循 302 跳转
-r, --range ......................... 指定下载内容字节范围
-z, --time-cond ..................... 根据指定日期下载
输出 ----------------------------------------------------------------
-#, --progress-bar .................. 进度条
-i, --include ....................... 输出信息中包括 Response 头信息
-s, --silent ........................ 静默模式,不显示进度
-S, --show-error .................... 静默模式但显示错误
--trace
--trace-ascii
--trace-time ........................ 访问的详细过程
-v, --verbose ....................... 开启 verbose 模式,打印详情
-w, --write-out ..................... 传输完成后显示传输信息
网络 ----------------------------------------------------------------
-x, --proxy ......................... 使用代理服务器
请求头 ----------------------------------------------------------------
-A, --user-agent .................... 指定 User-Agent
-b, --cookie ........................ 使用 Cookie 文件中的内容访问
-c, --cookie-jar .................... 将 Cookie 保存到文件
-e, --referer ....................... 指定 Referer
-E, --cert .......................... 双向认证时指定客户端证书
-H, --header ........................ 指定 Header
-u, --user .......................... HTTP 认证,默认为 Basic Auth
证书 ----------------------------------------------------------------
--cacert ............................ 指定 CA 证书用于校验服务器
-k, --insecure ...................... 允许使用不安全证书
协议 ----------------------------------------------------------------
--mail-from、--mail-rcpt ............ 使用 SMTP 协议发送邮件
-T, --upload-file ................... 上传 FTP
一、HTTP 协议
1、下载单个文件
从 URL 获取内容,并显示到 STDOUT(如:控制台)
$ curl http://www.centos.org
要输出到一个文件,可以通过重定向的方法。这种方法同时也会现实一些额外的下载状态。
$ curl http://www.centos.org > centos-org.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 27329 0 27329 0 0 104k 0 --:--:-- --:--:-- --:--:-- 167k
2、cURL 输出到文件(-O
/ -o
)
使用 -o
或 -O
选项
-
-o
(小写)输出到命令行中提供的文件名 -
-O
(大写)输出到 URL 中带的文件名
例如:
$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
这样的话,内容会被保存到 mygettext.html
中。同时也会看到,使用 -o
参数,也会像下面这样显示下载进度:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
66 1215k 66 805k 0 0 33060 0 0:00:37 0:00:24 0:00:13 45900
100 1215k 100 1215k 0 0 39474 0 0:00:31 0:00:31 --:--:-- 68987
当使用 -O(大写)
参数时,会保存到 gettext.html
中。
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
注意:当 cURL 将内容输出到控制台时,不会显示下载进度,以避免显示内容的混乱。可以使用 >
-o
-O
来将结果输出到文件。
与使用 cURL 一样,也可以使用 wget 下载文件,具体使用方法参考 Wget Examples
3、一次性获取多个文件(-O
)
语法:
$ curl -O URL1 -O URL2
下面的命令行,可以同时下载 index.html
和 gettext.html
到当前目录。
$ curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html
如果像上面这样,从同一个服务器下载多个文件,cURL 会尝试重用连接
4、遵从 HTTP Location 头信息做跳转(-L
)
默认情况,cURL 不会根据 HTTP 的 Location 头(称为 重定向)。当请求的 Web 内容移动到了其他的位置,HTTP Location 头会作为 Response 的一部分返回,并且指明实际的位置。
例如:当有人在印度使用浏览器访问 google.com
,会被自动重定向到 google.co.in
。这是基于以下的 HTTP Location 头来完成的:
$ curl http://www.google.com
302 Moved
302 Moved
The document has moved
here
这一段内容,说明请求的内容,已经被移动到了 http://www.google.co.in
。
如果想使用 cURL 也完成这样的跳转,可以使用 -L
选项。
$ curl -L http://www.google.com
5、继续/恢复 之前的下载(-C
)
使用 cURL 的 -C
选项,可以继续之前停止的下载。这对于下载大文件,或下载被打断的情况很有帮助。
如果使用了 -C -
,也就是 -C
后面加空格,再跟个 -
,cURL 会自动找到从哪里开始继续下载。
我们也可以使用 -C
,指定位移字节数,这样的话,会从源文件头跳过这些字节数后,再开始下载。
使用 cURL 下载一个大文件,使用 Ctrl+C
,停止:
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
############## 20.1%
注意:-#
用于显示一个进度条,而不是一个进度表。
现在下载已经停止在 20.1%,现在可以使用 -C -
来继续后面的下载。
6、限定传输速率(--limit-rate
)
可以使用 --limit-rate
选项,指定最大传输速率。
$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html
上面的命令行,限定数据传输速率为 1000Byte/second
。cURL 有可能会阶段性使用更高的速率,但是平均值会在 1000Byte/second
。
下面是刚才命令行执行时的进度表,可以看到,速度是接近 1000 Bytes
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
1 1215k 1 13601 0 0 957 0 0:21:40 0:00:14 0:21:26 999
1 1215k 1 14601 0 0 960 0 0:21:36 0:00:15 0:21:21 999
1 1215k 1 15601 0 0 962 0 0:21:34 0:00:16 0:21:18 999
7、判定在指定日期 之前/之后 修改过,才下载文件(-z
)
可以在 cURL 的命令行中,使用 -z
选项,来获取指定日期之后修改过的文件。这个选项对于 HTTP 和 FTP 都有效。
$ curl -z 21-Dec-11 http://www.example.com/yy.html
上面的命令,只在 yy.html 在指定日期之后修改过,才会下载。
$ curl -z -21-Dec-11 http://www.example.com/yy.html
上面的命令,只在 yy.html 在指定日期之前修改过,才会下载。注意日期前面的 -
。
请参考 man curl_getdate
获取各种日期表达式支持。
8、使用 cURL 通过 HTTP Authentication(-u
)
有时候,网站需要 用户名 和 密码 认证,才能查看文件内容。也可以使用(.htaccess 文件)。可以使用 -u
选项,通过 cURL 把认证信息传到服务器。如:
$ curl -u username:password URL
注意:默认情况下,cURL 使用 Basic HTTP Authentication。可以使用 –ntlm | –digest 选项,指定其他认证方式。
9、从 FTP 服务器下载文件
cURL 也可以从 FTP 服务器下载文件。如果给定的 FTP 路径是个目录,默认会列出此目录下的所有文件。
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
上面的命令,下载了 xss.php。
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
这是列表的情况。
FTP/SFTP 新手,参考 FTP SFTP Tutorial for Beginners
10、使用范围进行列表、下载
$ curl ftp://ftp.uk.debian.org/debian/pool/main/[a-z]/
11、使用代理服务器(-x
)
通过指定 -x
选项,来指定代理服务器和端口。
$ curl -x proxysever.test.com:3128 http://google.co.in
12、更详细的信息(-v
,--trace
,--trace-ascii
,--trace-time
)
可以使用 -v
选项,来知道到底发生了什么。-v
开启 verbose 模式,打印详情。
curl -v http://google.co.in
上面的命令输入如下内容:
* About to connect() to www.google.co.in port 80 (#0)
* Trying 74.125.236.56... connected
* Connected to www.google.co.in (74.125.236.56) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6
> Host: www.google.co.in
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Tue, 10 Apr 2012 11:18:39 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< Set-Cookie: PREF=ID=7c497a6b15cc092d:FF=0:TM=1334056719:LM=1334056719:S=UORpBwxFmTRkbXLj; expires=Thu, 10-Apr-2014 11:18:39 GMT; path=/; domain=.google.co.in
.
.
如果需要更详细的信息,使用 --trace
选项。这里为了演示方便,使用 --trace-ascii
只显示 ASCII 内容,并通过 --trace-time
显示时间戳:
# 访问 httpbin,测试延迟 3 秒的请求
$ curl --trace-ascii traceinfo.txt --trace-time http://httpbin.org/delay/3
信息会记录到指定的 traceinfo.txt
中:(如果传入 -
则显示到控制台)
23:27:00.786693 == Info: Trying 34.193.212.251...
23:27:00.787303 == Info: TCP_NODELAY set
23:27:02.137448 == Info: Connected to httpbin.org (34.193.212.251) port 80 (#0)
23:27:02.137524 => Send header, 82 bytes (0x52)
0000: GET /delay/3 HTTP/1.1
0017: Host: httpbin.org
002a: User-Agent: curl/7.64.1
0043: Accept: */*
0050:
23:27:10.022422 <= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
23:27:10.022481 <= Recv header, 40 bytes (0x28)
0000: Access-Control-Allow-Credentials: true
23:27:10.022501 <= Recv header, 32 bytes (0x20)
0000: Access-Control-Allow-Origin: *
23:27:10.022521 <= Recv header, 32 bytes (0x20)
0000: Content-Type: application/json
23:27:10.022538 <= Recv header, 37 bytes (0x25)
0000: Date: Mon, 02 Dec 2019 15:27:04 GMT
23:27:10.022554 <= Recv header, 45 bytes (0x2d)
0000: Referrer-Policy: no-referrer-when-downgrade
23:27:10.022573 <= Recv header, 15 bytes (0xf)
0000: Server: nginx
23:27:10.022588 <= Recv header, 33 bytes (0x21)
0000: X-Content-Type-Options: nosniff
23:27:10.022604 <= Recv header, 23 bytes (0x17)
0000: X-Frame-Options: DENY
23:27:10.022619 <= Recv header, 33 bytes (0x21)
0000: X-XSS-Protection: 1; mode=block
23:27:10.022636 <= Recv header, 21 bytes (0x15)
0000: Content-Length: 254
23:27:10.022651 <= Recv header, 24 bytes (0x18)
0000: Connection: keep-alive
23:27:10.022667 <= Recv header, 2 bytes (0x2)
0000:
23:27:10.022680 <= Recv data, 254 bytes (0xfe)
0000: {. "args": {}, . "data": "", . "files": {}, . "form": {}, .
0040: "headers": {. "Accept": "*/*", . "Host": "httpbin.org", .
0080: "User-Agent": "curl/7.64.1". }, . "origin": "111.30.232.16
00c0: 0, 111.30.232.160", . "url": "https://httpbin.org/delay/3".}.
23:27:10.022766 == Info: Connection #0 to host httpbin.org left intact
verbose 和 trace 选项,可以在 cURL 发生未知原因失败时使用。
13、传输完成后显示传输信息(-w
)
curl -o /dev/null -s -w \
'http_code: %{http_code}
http_connect: %{http_connect}
content_type: %{content_type}
time_appconnect: %{time_appconnect}
time_connect: %{time_connect}
time_namelookup: %{time_namelookup}
time_pretransfer: %{time_pretransfer}
time_redirect: %{time_redirect}
time_starttransfer: %{time_starttransfer}
time_total: %{time_total}
speed_download: %{speed_download}' http://httpbin.org/delay/3
执行结果:
http_code: 200
http_connect: 000
content_type: application/json
time_appconnect: 0.000000
time_connect: 1.324640
time_namelookup: 0.023474
time_pretransfer: 1.324761
time_redirect: 0.000000
time_starttransfer: 5.444911
time_total: 5.445035
speed_download: 46.000
二、其它协议
14、将文件上传到 FTP 服务器(-T
)
cURL 可以使用 -T 选项。
$ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com
上面的命令,将 myfile.txt 上传到 FTP 服务器。也可以使用 range 选项,一次性上传多个文件。
$ curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com
也可以使用 -
来获取 STDIN 输入,并传输到服务器。
$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
上面的命令,获取 STDIN 的输入,并将内容保存到 myfile_1.txt。
可以为每个 URL 提供一个 -T 参数,指定每个上传的位置。
15、使用 SMTP 协议发送邮件(--mail-from
、--mail-rcpt
)
$ curl --mail-from [email protected] --mail-rcpt [email protected] smtp://mailserver.com
上面的命令行输入后,会等待用户输入数据。输入内容后,键入 .
作为最后一行,然后邮件会被立即发送。
16、使用 POP3 协议收取邮件
$ curl pop3://username:[email protected]/INBOX mailindex(整数)
17、使用 IMAP 协议收取邮件
$ curl --url "imap://mail.example.com/" --user "user:password"
$ curl --insecure --url "imaps://mail.example.com/" --user "user:password"
Performing IMAP queries via curl
三、参考链接
- 15 Practical Linux cURL Command Examples (cURL Download Examples)
- Using curl to automate HTTP jobs
- cURL常用命令
- cURL命令详解
- curl 常用参数总结
- CURL常用命令
(完)