' k; Y! T8 o& K( `7 H curl 是 Linux 系统上一款网络工具,它的首字母 c 代表的是 client,表示它是客户端程序通过 URL 方式,可以实现客户端与服务器之间传递数据它的功能非常强大,支持大部分常见的网络协议:HTTP、HTTPS、FTP。
) B* `' j3 M/ r6 n' B& X9 p 功能特性也很丰富,支持 http、https、cookie、认证、代理、速率限制、断点续传,提供非常多的选项,熟练运用的话,基本可以取代 postman 这类图形工具与liburl关系其实 curl 项目包括两部分:
3 d6 f, R( A9 H& S3 g curl 和 libcurl,关系大概如图所示 1 T! ?6 c: ~2 f: I: _; x
curl 是命令行工具,底层调用的是 libcurl 库libcurl 是以库形式存在,提供各种功能 C 接口,供其他程序调用,包括 curl 命令安装使用和 wget 不同,并非所有的 Linux 发行版中都安装了 curl,你可以使用包管理器自行安装。 $ F' L$ o1 R9 _8 t7 M
# ubuntu or debian
# u' Y2 a2 X$ B) i* U& o $ apt install curl' j A2 D4 k: F7 N2 M9 A
# centos or redhat! v: L# E* o; J! I( E+ }) J- I
$ yum install curl/ O, I+ D- k/ s; l- J
如果需要使用最新版本,或自定义安装,可以通过源码编译方式进行安装
6 P. O: E( V, M; c. U8 K& ]9 ]; N $ wget https://curl.se/download/curl-7.79.1.tar.gz3 P$ w- ^& G9 ]" K9 {1 s
$ ./configure
1 P2 l8 J* j6 _3 C n" v, @# Z' ^: { $ make) b: v3 j5 T! X# Y
$ make install
* T8 v. k! e5 p$ I8 K& e5 k# n+ _ 通过 curl --version
. Z+ V/ s( ^% l3 z 可以验证命令是否安装准确上手操作我们先来看下 curl 最简单的使用方式,没有任何选项,将服务器响应的内容输出到屏幕上$ curl http://linuxblogs.cn
. u. O! S- w8 c2 R! b) V 有时我们不想显示错误和进度信息,可以使用
5 u! A( Y3 i0 I -s 选项开启静默模式$ curl -s http://linuxblogs.cn
5 G0 l8 D% s2 b+ E8 L, y # 完全不输出任何内容,可以通过"echo $?"来判断命令成功或失败
4 d- h/ j3 G% B $ curl -s -o /dev/null http://linuxblogs.cn
9 F. k+ I. r% ^1 o& x! r8 O. Y
3 j6 A3 z, E. u, w' \ 通过 -v 选项可以非常详细地显示 curl 的整个工作过程,相当于打开了调试模式请求http接着介绍我们平时最常用的,和 http 数据传输相关的操作1. 发送 GET 请求curl 命令默认发送的是
& Q9 P M3 s6 | _ GET 请求,响应内容直接打印在了屏幕上$ curl http://www.baidu.com
/ p/ n( @; }2 W$ Q 使用 -i 选项,可以打印服务器响应的 HTTP 头部信息# 先打印请求头,空一行,再打印网页内容
& [. w) J/ l1 F9 c $ curl -i http://www.baidu.com! U) y! \9 H; y1 K; O+ w% y. z' g
8 U" i. m* k5 S9 U0 t
如果只想测试该链接或资源是否正常,使用 -I 选项,可以只打印响应头信息,注意此时发送的是 HEAD 请求2. 发送 POST 请求默认情况下,curl 发送的是 GET 请求,使用 -X 参数可以指定发送
, i- A& t" V% C POST 请求,使用 -d 参数可以指定请求数据# 无数据的 POST 请求
2 a: [; m' ^- L& D $ curl -x POST http://www.domain.com
! u! [5 w+ D8 v; P. ?( r # 发送 Form 数据
' l6 y0 A2 B& z% ~0 O( I3 o2 M $ curl -d user=foo&pass=123 -X POST http://google.com/login' B p1 I e7 k1 f
# 等价于上边命令
# s" i2 f1 F8 J2 e% {2 r7 L $ curl -d user=foo -d pass=123 http://google.com/login8 B; M3 r! w0 E4 t
* H+ `0 `) F2 R0 O+ V1 X
使用 -d 选项后,默认就是 POST 请求,可以省略 -X 选项,另外,使用多个 -d 选项,可以使命令行显得更清晰下边命令可以读取本地文件,作为数据向服务器发送$ curl -d @data.txt http://google.com/login
5 k. c7 p+ }, s- N! W/ ]( v
8 T9 O8 c6 O# i- s+ R 3. 发送 Json 格式数据请求curl 可以发送 json 格式的请求,需要设置 Content-Type 为 application/json$ curl -d {"user":"foo","pass":"123"} \8 @/ F7 y+ |) I* l# E% [
-H Content-Type: application/json \ ^" N9 \5 ]) k* P" C
http://google.com/login
( F; u1 K& K0 K! M/ Y% c2 s6 \/ A# t 6 @$ u4 g/ |8 G3 v
-H 选项指定 Content-Type 请求头为 json 格式,这样 web 服务器就清楚数据类型,知道该怎么处理了4. 构造查询字符串参数通过 -G 选项,可以构造查询字符串参数curl -G -d q=chopin -d count=20 http://google.com/search
. Y6 @2 ~( T7 }3 a # 等价于下边命令
0 k& c% D9 }& k curl http://google.com/search?q=chopin&count=20; }5 [: Q5 m x j) Q9 ~* k: Z w
2 v# G( J" o$ h: t! r 上述命令会发送 GET 请求,如果忽略 -G 选项,会发出一个 POST 请求5. 添加请求头通过 -H 选项,可以为请求添加标头$ curl -H Accept-Language: en-US http://google.com" x ~: X9 j) g7 N* b9 b" Q0 }
# 可以指定多个-H选项
- k( K2 m3 S, ^( W+ g: ~. q* H $ curl -H Accept-Language: en-US -H Secret-Message: xyzzy http://google.com
6 u- P. c- a' k# M* U 3 f j. `; E0 _' L1 ~
6. 设置重定向默认 curl 不会跟随重定向,指定 -L 选项会让请求跟随服务器重定向$ curl -L http://api.twitter.com/hello; \7 a$ R3 @0 ^& p0 u9 N8 R' S
7. 设置静默输出指定 -s 选项将不输出错误和进度信息,如果想让 curl 不产生任何输出,使用下面的命令 3 R5 ^$ Z1 k7 [4 T# v f
$ curl -s -o /dev/null http://google.com
" ~# V; r; Q! P8 ]/ A& N, ? 8. 详细的调试信息指定 -v 选项,会输出通信的整个过程,一般用于调试$ curl -v http://www.baidu.com
2 K: N* y/ ]. e2 v* \! R9 }
* Y# j$ f3 C4 H --trace 选项也可以用来调试,还可以输出更详细的内容,比如原始的二进制数据$ curl --trace - http://www.baidu.com/ N8 q) W: M: P& i8 [
9. 模拟浏览器访问-A 选项可以指定客户端的用户代理信息,即设置 & T1 v% t2 Z1 i. H
UserAgent 请求头$ curl -A Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 http://google.com+ w9 ^# P+ A7 X- X: Y
。 4 o4 j, U, i U7 M( {* A
上面命令将 UserAgent 设置成了 Chrome 浏览器的标识其实也可以直接通过 -H 选项来指定$ curl -H "User-Agent: go/1.15" http://google.com: \! `6 U; X `( G: k' R R
。
9 A5 q" O2 U+ F2 x* z7 V) t 10. 伪造 refer 解决防盗链有时候,引用或下载某网站图片等资源时,会有防盗链的限制,可以通过设置 refer 请求头为站内域名来解决# -e 参数来设置 HTTP 请求头 Referer8 Z/ c: w7 s- h5 G- }2 C4 K5 k+ U
$ curl -e http://linuxblogs.cn http://linuxblogs.cn/girl.jpg
) A, m& h7 j5 k4 n. y # -H 参数也可以直接设置请求头 Referer
* p& {$ R$ n8 f7 W' p6 m$ G" b0 [ $ curl -H "Referer: http://linuxblogs.cn" http://linuxblogs.cn/girl.jpg4 o. Y! v8 M; r: G6 A
' p& A& y. b' f+ X
11. 设置 Cookie-b 选项用来向服务器发送 Cookie,该命令会生成一个请求头 Cookie: foo=bar,向服务器发送一个 Cookie$ curl -b foo=bar http://google.com
) k: z, Q" H& k% ?7 k2 W # 发送两个cookie
- r! r8 V1 g+ i$ O $ curl -b foo=bar;name=mike http://google.com
6 Z6 k- r! T7 q$ y4 E3 {
& d4 O, a! C% Z3 Y4 G 也可以通过读取本地 cookie 文件,将其发送给服务器-c 选项可以将服务器响应的 Cookie 写入一个文件$ curl -b cookie.txt http://google.com: w* C* C: \: ?# j* K! Q
# 将cookie写入文件' z0 N4 X$ r! P, H, D4 o% i$ m
$ curl -c cookie.txt http://baidu.com3 n s* a0 z( S C$ f- S c
。
7 ~2 z! R# [8 R- k2 ], a 文件操作1. 下载文件资源使用 -o 或 -O 选项,可以将网络资源保存到文件中# 等效于 wget' K/ u$ y5 f! O. x- Z% \
$ curl -o chopin.html http://linuxblogs.cn
1 ?9 a% j6 [; `0 K9 f0 I/ _ # -O 选项,可以将 URL 的最后部分当做文件名8 _# L& i# e! s" `! ~
$ curl -O http://linuxblogs.cn/bar.html
) q' x2 x) {" P' d
: y* O, R! v8 Z& _( o 如果想显示下载进度条,可以使用 -# 选项2. 循环下载文件有时候要下载的多个文件,只有名称后缀不同,可以这样来下载$ curl -O http://linuxblogs.cn/dog[1-5].jpg" G/ Z% r; Y" @, g0 u# k# q; L
1 n; ~$ L5 p \& s0 z
3. 压缩下载使用 --compressed 选项,允许你要求 HTTP 和 HTTPS 服务器提供数据的压缩版本,这在带宽有限的情况下,可以帮你节约不少时间curl --compressed http://linuxblogs.cn/foo.txt
z* P6 d8 S+ t! G$ f
; B( H ]* ?0 C: ~5 M 4. 限制下载速度如果带宽不是很充足,多人共享带宽,curl 支持限速功能$ curl http://linuxblogs.cn --limit-rate 200K
# d' y k2 |8 H8 \. L, Z) U) c1 K 另外一个用法,就是模拟测试慢网速的场景,用于做开发测试
* N/ p# m6 P/ q3 }: m/ ~( m1 B 5. 分块下载有时文件会很大,我们采用可以分段的方式进行下载,最后合并为完成的文件$ curl -r 0-100 -o part1.mp4 http://linuxblogs.cn/cang.mp4. v' h8 _' U( P8 k% n
$ curl -r 100-200 -o part2.mp4 http://linuxblogs.cn/cang.mp4
$ G! j* h7 T8 e7 y, a" p" E% v $ curl -r 200- -o part3.mp4 http://linuxblogs.cn/cang.mp4
; X3 P4 r% U, W: ?7 O* V3 F1 ` $ cat part*.mp4 > cang.mp4
; g* C1 B8 n$ i
8 G3 G, R5 p8 D% M2 T0 @& C) x6 K b 6. 断点续传有时候网络不太好,通过 curl 下载大文件时,可能发生中断的现象使用 -C 选项可以实现断点续传,非常实用$ curl -C -O http://linuxblogs.cn/girl.mp4
* A; V/ X; R1 I/ e 。 ' F, P0 ?7 F$ g" v2 S) y* a. p5 y
在弱网环境下,加上 --retry N 选项,可以在失败的时候多次重试,对下载操作更友好一些7. 通过 FTP 下载文件支持下载 FTP 文件,curl 提供两种下载的语法$ curl -O -u user:pass ftp://linuxblogs.cn/dog.jpg
5 H4 j3 D. A9 r9 q! R $ curl -O ftp://user:pass@linuxblogs.cn/dog.jpg
8 v W& X7 H( i/ z; { 。
1 \1 k& P; K2 Z7 M+ o0 x8 o 8. 上传文件平时开发时,可以通过 curl 实现文件的上传功能,非常高效# 命令会给 HTTP 加上请求头 Content-Type: multipart/form-datas
7 ~7 c3 o9 v7 P5 h! i2 D( Y/ j $ curl -F file=@苍老师.mp4 http://linuxblogs.cn/upload0 @' V2 ]7 \8 \
。 ; G2 x+ G5 ?: V4 G5 D) J/ [' \
-F 选项还可以指定 MIME 类型和文件名$ curl -F file=@苍老师.mp4;type=image/png http://linuxblogs.cn/upload
3 u$ k* ]/ ] \0 C) S # 还可以支持修改文件名,而不是默认的! a, Q$ c/ b+ L
$ curl -F file=@苍老师.mp4;file=天空.mp4 http://linuxblogs.cn/upload) S5 i9 m( E" {, q; l' u3 L
6 o. h: @ I1 A- y* X6 ? https相关目前大多数站点采用的都是 https,这里给出几个常见的用法1. 忽略证书验证有时访问 https 站点时,服务器证书过期或是自签证书,使用 curl 访问时会报错,可以指定 -k 选项来忽略证书有效性验证。
; R* F p8 \ M4 f9 o$ ? $ curl -k https://linuxblogs.cn
! S) B: I$ h. Z- h3 v: p, m 2. 指定客户端证书有时需要双向验证,服务器也要验证客户端,用来确定客户端的真实身份可以使用 --cert 和 --key 指定客户端证书。
1 V# ]3 u5 e$ m6 s* \$ `7 }! Q $ curl --cert client.pem --key key.pem https://linuxblogs.cn& Y8 _- X8 J: J5 h) e5 K2 p
3. 使用证书链验证服务器证书在平时开发时,证书一般是自签的,可以通过指定 CA 证书链进行证书的验证 , O& t6 R; f+ L V- j- t
$ curl --cacert caChain.pem https://linuxblogs.cn& P, J% `0 B" E$ J) o4 U
高级功能(一)设置代理1. 命令行通过命令行,可以很简单的实现 curl 代理功能$ curl -x "http://user:pwd@127.0.0.1:1234" "http://linuxblogs.cn" |, a8 Z; }# D9 x i
3 {, J/ Z( g! `9 o: p+ T2 Z2 _9 S 2. 使用环境变量通过设置环境的方式也很简单$ export http_proxy="http://user:pwd@127.0.0.1:1234"* @9 n: [1 H* M' G, E- M/ G8 c
3. 使用配置文件使用配置文件 ~/.curlrc,修改内容如下:
; B; F3 G# t6 F- [4 G' s proxy="http://user:pwd@127.0.0.1:1234"
3 X$ m& z. {' Q$ _5 O1 B (二)格式化在平时使用 curl 时,可能希望能够获取更多信息,如请求耗时、访问时延、请求大小等信息比如在生产环境要测试某个接口,可以通过如下的方式,获取你想要的数据,非常方便。
/ v2 a$ I: r, D # 只获取http状态码" @' ]1 Z) L" u4 H, {3 X
$ curl -s -w %{http_code} https://baidu.com -o /dev/null
9 J& y% Y8 l6 m9 [2 S 不过瘾?直接上大招,首先需要准备格式模板 ' B7 T# a/ G9 L6 K) g4 ?% [3 O& R
有了上边的格式模板,我们就可以轻松获取非常漂亮的统计数据
) C$ C K' q7 ? 我们可以很清晰地看到,域名解析、连接建立时间、下载速度、状态码等数据。当然 curl 支持的关键字段还有很多,更多的字段可以参考 man 手册。 F" E2 L8 l# K* a" N5 F% |7 B
4 C q8 o* [ E- @ k( h
: b8 L4 w4 ~! t/ M) e+ G" S$ _2 [7 d
8 j% w }+ X3 d' `
|