cURL 晓志

cURL 是一个软件包,由命令行工具和库组成,用于使用 URL 语法进行数据传输。
  cURL 支持各种协议,如:

DICT
FILE
FTP
FTPS
Gopher
HTTP
HTTPS
IMAP
IMAPS
LDAP
LDAPS
POP3
POP3S
RTMP
RTSP
SCP
SFTP
SMTP
SMTPS
Telnet
TFTP

〇、涉及到的命令

行为 ****************************************************************
    --data-ascii <data>
-d, --data <data> .................................. POST 数据
    --data-binary .................................. 同 -d,但不对数据做字符转换,@ 指定文件名
    --data-raw <data> .............................. 同 -d,@ 按普通字符对待,后续内容不按文件名处理
    --data-urlencode <data> ........................ POST 数据(明确指定需要进行 URLEncode,参数中有敏感字符需要这样使用)
-F, --form <name=content> .......................... POST 数据,表单提交
-G, --get .......................................... 将参数以 GET 方式请求
-I, --head ......................................... 相当于 HTTP HEAD 方法
-o, --output <file> ................................ 下载到指定文件名
-O, --remote-name .................................. 下载到默认文件名,默认从 URL 中提取文件名
-J, --remote-header-name ........................... 告诉 -O 选项使用服务器指定的 Content-Disposition 文件名
-X, --request <command> ............................ 指定请求方法(GET/POST/PUT/DELETE等,根据协议而定)

传输控制 *************************************************************
-C, --continue-at <offset> ......................... 断点续传
    --limit-rate <speed> ........................... 限速
-L, --location ..................................... 遵循 302 跳转
-r, --range <range> ................................ 指定下载内容字节范围
-z, --time-cond <time> ............................. 根据指定日期下载

输出 ****************************************************************
-#, --progress-bar ................................. 进度条
-f, --fail ......................................... HTTP 服务能够连接,但返回非正常状态码时(如:40x),表现为命令失败,并不返回数据
-i, --include ...................................... 输出信息中包括 Response 头信息
-s, --silent ....................................... 静默模式,不显示进度
-S, --show-error ................................... 静默模式但显示错误
    --trace <file>
    --trace-ascii <file>
    --trace-time ................................... 访问的详细过程
-v, --verbose ...................................... 开启 verbose 模式,打印详情
-w, --write-out <format> ........................... 传输完成后显示传输信息

网络 ****************************************************************
    --connect-timeout <seconds> .................... 连接允许的最长时间(连接服务器时间长时使用)
    --local-port <num/range> ....................... 本地端口
-m, --max-time <seconds> ........................... 传输允许的最长时间(服务器数据处理时间长时使用)
-x, --proxy [protocol://]host[:port] ............... 使用代理服务器
    --resolve <[+]host:port:addr[,addr]...> ........ 自定义域名解析

请求头 ****************************************************************
-A, --user-agent <name> ............................ 指定 User-Agent
-b, --cookie <data|filename>........................ 使用指定 Cookie 或文件中的内容作为 Cookie 信息
-c, --cookie-jar <filename> ........................ 将 Cookie 保存到文件
-e, --referer <URL> ................................ 指定 Referer
-H, --header <header/@file> ........................ 指定 Header
    --oauth2-bearer <token> ........................ OAuth 2 Bearer Token
-u, --user <user:password> ......................... HTTP 认证,默认为 Basic Auth

证书 ****************************************************************
    --cacert <file> ................................ 指定 CA 证书用于校验服务器
-E, --cert <certificate[:password]> ................ 双向认证时指定客户端证书和密码
    --cert-type <type> ............................. 证书文件类型(DER/PEM/ENG)
-k, --insecure ..................................... 允许使用不安全证书

协议 ****************************************************************
    --mail-from、--mail-rcpt <address> ............. 使用 SMTP 协议发送邮件
-T, --upload-file <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

<TITLE>302 Moved</TITLE>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.in/">here</A>

这一段内容,说明请求的内容,已经被移动到了 http://www.google.co.in

如果想使用 cURL 也完成这样的跳转,可以使用 -L 选项。

$ curl -L http://www.google.com
5、使用 cURL 通过 HTTP Authentication(-u

有时候,网站需要 用户名 和 密码 认证,才能查看文件内容。也可以使用(.htaccess 文件)。可以使用 -u 选项,通过 cURL 把认证信息传到服务器。如:

$ curl -u username:password URL

注意:默认情况下,cURL 使用 Basic HTTP Authentication。可以使用 –ntlm | –digest 选项,指定其他认证方式。

6、使用代理服务器(-x

通过指定 -x 选项,来指定代理服务器和端口。

$ curl -x proxysever.test.com:3128 http://google.co.in

从 7.21.7 开始,可以使用 protocol:// 前缀指定代理协议。 使用 socks4://socks4a://socks5://socks5h:// 指定要使用的 SOCKS 版本。 未指定协议的话,http:// 和所有其他协议都将被视为 HTTP 代理。

7、更详细的信息(-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 发生未知原因失败时使用。

8、传输完成后显示传输信息(-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
9、自定义域名解析(--resolve

对于不具备自定义域名解析能力的场景,如:

  • 无法自定义 DNS
  • 无法修改 /etc/hosts

恰巧 HTTP 服务器有配置了虚拟主机,需要通过 server_name 来进行 SNI,就需要自定义域名解析能力了。

(1)场景一:通过 IP 访问 做了虚拟主机配置的 HTTP 服务

假设服务器 IP 为:1.2.3.4

但配置了多个虚拟主机,我们需要访问:your-server.net

$ curl 'http://1.2.3.4' -H 'Host: your-server.net'

(2)场景二:通过 IP 访问 做了虚拟主机配置的 HTTPS 服务

由于 HTTPS 服务需要验证访问的域名与证书的匹配性,所以无法通过前面通过制定 Host 头的方式进行处理。

这里需要使用 --resolve 参数:

$ curl 'https://your-server.net' --resolve 'your-server.net:443:1.2.3.4'

可以将这种方式视为命令行上提供的一种 /etc/hosts 替代方案。这种方式支持域名的通配符,也可以支持多个 IP 地址。

(二)辅助

1、继续/恢复 之前的下载(-C

使用 cURL 的 -C 选项,可以继续之前停止的下载。这对于下载大文件,或下载被打断的情况很有帮助。
  如果使用了 -C -,也就是 -C 后面加空格,再跟个 -,cURL 会自动找到从哪里开始继续下载。
  我们也可以使用 -C <offset>,指定位移字节数,这样的话,会从源文件头跳过这些字节数后,再开始下载。
  使用 cURL 下载一个大文件,使用 Ctrl+C,停止:

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
##############             20.1%

注意:-# 用于显示一个进度条,而不是一个进度表。

现在下载已经停止在 20.1%,现在可以使用 -C - 来继续后面的下载。

2、限定传输速率(--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
3、判定在指定日期 之前/之后 修改过,才下载文件(-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 获取各种日期表达式支持。

4、使用范围进行列表、下载
$ curl ftp://ftp.uk.debian.org/debian/pool/main/[a-z]/

对 HTTP 协议也是一样的。

二、其它协议

1、从 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

2、将文件上传到 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 参数,指定每个上传的位置。

3、使用 SMTP 协议发送邮件(--mail-from--mail-rcpt

$ curl --mail-from blah@test.com --mail-rcpt foo@test.com smtp://mailserver.com

上面的命令行输入后,会等待用户输入数据。输入内容后,键入 . 作为最后一行,然后邮件会被立即发送。

4、使用 POP3 协议收取邮件

$ curl pop3://username:password@mail.server/INBOX mailindex(整数)

5、使用 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

三、参考链接

(完)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • Linux 命令-curl 常用命令 下载单个文件 cur http://www.demo.com 默认将输出打印...
    majun00阅读 4,908评论 0 5
  • curl命令 网络应用 curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以...
    呵呵哒1991阅读 1,160评论 0 2
  • cURL 必知必会(英文版网址) cURL 项目的组成部分 cURL 项目主要由两部分组成: 命令行工具 curl...
    独木舟的木阅读 3,979评论 0 2
  • 一,curl 定义: cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、...
    君满楼001阅读 1,047评论 0 1
  • curl是一个命令行工具,通过指定的URL来上传或下载数据,并将数据展示出来。curl中的c表示client,而U...
    起名难倒英雄汉阅读 197,138评论 6 64