cURL 命令样例及实践

cURL 命令样例及实践_第1张图片
cURL 命令样例及实践_第2张图片

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.htmlgettext.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常用命令

(完)

你可能感兴趣的:(cURL 命令样例及实践)