- 积分
- 16844
在线时间 小时
最后登录1970-1-1
|

楼主 |
发表于 2021-11-2 16:44:31
|
显示全部楼层
命令:curl
7 x5 [! X$ f! h- {' a9 Z在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。
6 T! [- p' A8 w8 [2 c
- |7 m0 G% [+ ]2 ^; v% K6 {语法:# curl [option]
' T% l# H# j6 y常见参数:
" d1 j) R4 N( R- T
9 p4 e- A L' m. Z$ i复制代码
7 A$ s* a1 N# \' P p, u7 W# a3 F复制代码1 o' }6 |% S, U6 S: z7 f4 D! B+ R
-A/--user-agent <string> 设置用户代理发送给服务器7 j9 m$ |& f5 Q6 m4 W. ^
-b/--cookie <name=string/file> cookie字符串或文件读取位置
& m8 `9 C1 m, {- i6 ]9 I/ i4 p-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
* B( z% ]& u0 }! B( G E, X$ N- d-C/--continue-at <offset> 断点续转
; A$ q) f# U5 a2 a( K# H-D/--dump-header <file> 把header信息写入到该文件中
% f0 e3 y! w6 F% s2 C' b% N! N1 X-e/--referer 来源网址1 k! H3 [* q P+ c) k& \" \5 N* o
-f/--fail 连接失败时不显示http错误
$ y+ h: f( Y5 i- b-o/--output 把输出写到该文件中
, @+ Q( l9 }9 x$ I& k k7 {% Q-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
0 Z7 b* H+ |$ g9 X-r/--range <range> 检索来自HTTP/1.1或FTP服务器字节范围
2 K& Q* t8 h* G-s/--silent 静音模式。不输出任何东西$ p; X) i5 U. G6 l! c
-T/--upload-file <file> 上传文件! w0 R; }! ^% j! ]! u6 k; W8 g
-u/--user <user[:password]> 设置服务器的用户和密码
" q" ~. X- q2 V6 g) i-w/--write-out [format] 什么输出完成后- b2 d: ]. H3 @: e- ~) O
-x/--proxy <host[:port]> 在给定的端口上使用HTTP代理4 J* h; \. O C/ [, [
-#/--progress-bar 进度条显示当前的传送状态( h: u( h7 w+ C5 i: P
复制代码( j# g# ?3 L( T+ m1 M# ~
复制代码- S! u# W* A8 }/ N9 N
例子:
% K7 s+ q, F( K1、基本用法
6 X6 t3 o* [* i. G: @* }7 c u' P
# curl [url]http://www.linux.com
+ B* n, L- L! B* W7 {执行后,www.linux.com 的html就会显示在屏幕上了
- G: ~* F H. B% bPs:由于安装linux的时候很多时候是没有安装桌面的,也意味着没有浏览器,因此这个方法也经常用于测试一台服务器是否可以到达一个网站
! S8 w( J" `- O* w$ f, A3 ] ~6 p- Y
2、保存访问的网页; j& {+ H* G( p
2.1:使用linux的重定向功能保存7 r# W% A% x0 g
8 j0 ?) D1 N7 n# N1 I# curl http://www.linux.com >> linux.html
8 h& o7 h0 Y- `4 T0 O8 h, y2.2:可以使用curl的内置option:-o(小写)保存网页
( S. x3 D8 j+ G+ f( _( Z; K- O
1 G, U" E$ ? J5 R: a' j$ curl -o linux.html http://www.linux.com
- z$ q* n, q/ x' g: \7 B! v" o执行完成后会显示如下界面,显示100%则表示保存成功! s$ d1 @5 [$ A) D9 j7 i, k
* o L! |( O& Q6 w: X8 E+ n% Total % Received % Xferd Average Speed Time Time Time Current5 Y, G: r4 G5 _+ o
Dload Upload Total Spent Left Speed
. X& j1 `6 g% v; U& l100 79684 0 79684 0 0 3437k 0 --:--:-- --:--:-- --:--:-- 7781k- W) T( u G! d: y/ V" G3 [% R; r
2.3:可以使用curl的内置option:-O(大写)保存网页中的文件
( i! C/ j5 b5 z9 J# i f要注意这里后面的url要具体到某个文件,不然抓不下来
% p, F. p6 N$ j/ L- }5 n3 ~" r5 V3 |6 O$ D# P' D7 H* A$ t
# curl -O http://www.linux.com/hello.sh
% y4 c3 d, X6 G4 X3、测试网页返回值
) t F ?; e/ E/ j! F% n- }& l- J/ ?, ^! e, N6 J/ z' s
# curl -o /dev/null -s -w %{http_code} www.linux.com
$ _. h2 {% x1 C8 w. LPs:在脚本中,这是很常见的测试网站是否正常的用法
6 I _4 @0 f. x/ q- v3 }' K
! A3 O2 M# H- T3 J' i" R4、指定proxy服务器以及其端口
3 R$ f _9 i+ W" s很多时候上网需要用到代理服务器(比如是使用代理服务器上网或者因为使用curl别人网站而被别人屏蔽IP地址的时候),幸运的是curl通过使用内置option:-x来支持设置代理5 L5 X$ @4 l$ O. d, [ c
) E, h: }) D) w( n) A
# curl -x 192.168.100.100:1080 http://www.linux.com
: o# p1 I, q% |! O5、cookie+ D/ w7 k; H( l
有些网站是使用cookie来记录session信息。对于chrome这样的浏览器,可以轻易处理cookie信息,但在curl中只要增加相关参数也是可以很容易的处理cookie
0 l& s# u7 P5 M$ {( U5 [5.1:保存http的response里面的cookie信息。内置option:-c(小写)
1 }8 t2 [2 p& d/ [* m" ~& {+ ]: \# k# M# o! W
# curl -c cookiec.txt http://www.linux.com
# Q; @, u4 K5 V* u& s执行后cookie信息就被存到了cookiec.txt里面了7 R2 H: o( ?7 b* x% m; {" E, l& l
* t4 C0 l& M) k& u9 j% r% O
5.2:保存http的response里面的header信息。内置option: -D
3 [6 N1 ?/ |9 d# Z& s% K; L: g' q" G* S, O+ [$ J) \+ Y
# curl -D cookied.txt http://www.linux.com
$ [- r( c8 L8 F8 B- ^执行后cookie信息就被存到了cookied.txt里面了
* \2 x% j9 h0 X% n& G2 {9 L! t
! u5 Q& R0 g+ `! X' O6 }注意:-c(小写)产生的cookie和-D里面的cookie是不一样的。( N/ B/ o- l! z7 I" B* I' a1 W
9 {3 r2 \$ y; t$ O6 ]8 @% _$ ^
U# o3 ^! r, C8 Q
5.3:使用cookie
" C# Q, a4 @8 z1 B2 J4 e很多网站都是通过监视你的cookie信息来判断你是否按规矩访问他们的网站的,因此我们需要使用保存的cookie信息。内置option: -b7 u( `) |' z) `& P1 H& Z
3 k8 Y8 d6 Y/ m4 k( M$ o) _ Y; D# curl -b cookiec.txt http://www.linux.com* [- ?' N" k% f* a+ s- V) j% E
6、模仿浏览器
, p. e! q( u! q+ _, m0 k有些网站需要使用特定的浏览器去访问他们,有些还需要使用某些特定的版本。curl内置option:-A可以让我们指定浏览器去访问网站
5 E0 B# E5 v. ^- ^! v
. M6 S$ G0 {& l' _* g8 c( ?9 e# curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com
/ ]3 B# r* A6 ^# H1 h4 k9 O2 U& H这样服务器端就会认为是使用IE8.0去访问的
; r, Y, Z3 @; I; y: m2 h2 u( W
" L3 z, L2 f( H4 N0 l7、伪造referer(盗链)! l' g- P+ \/ i' }- f
很多服务器会检查http访问的referer从而来控制访问。比如:你是先访问首页,然后再访问首页中的邮箱页面,这里访问邮箱的referer地址就是访问首页成功后的页面地址,如果服务器发现对邮箱页面访问的referer地址不是首页的地址,就断定那是个盗连了9 l. T% s! Q) } S1 L6 N' W
curl中内置option:-e可以让我们设定referer ^3 ^$ e7 W. h3 c( ~* y) o
' v+ S7 O- i; l- M* T& Q7 V5 e# curl -e "www.linux.com" http://mail.linux.com
1 ?2 v; `% P6 [& N& j这样就会让服务器其以为你是从www.linux.com点击某个链接过来的' u, a& y7 s* C) G0 E
0 X+ s- b' ?5 {0 g5 j" ~8、下载文件. G" _5 ~ A) I! p( o
8.1:利用curl下载文件。2 b0 { B) [7 ?% B/ m
#使用内置option:-o(小写)
0 @8 I/ H2 k* q$ C- ]# e: _
6 Z; `. ]0 h& t L1 D# curl -o dodo1.jpg http:9 w: W' x Q/ `8 M0 ]+ j( i8 {
#使用内置option:-O(大写)# g, V, R7 p: {. W
- |7 B: @. `. p. A3 a% A( o# curl -O
6 T& G, s9 B5 L* y% m这样就会以服务器上的名称保存文件到本地9 |2 k/ b. Z6 A% c0 i
' w k- b! [+ B, g9 ~) d
8.2:循环下载+ Z' `6 J% I, i) C) o3 ~
有时候下载图片可以能是前面的部分名称是一样的,就最后的尾椎名不一样
) |4 N5 J7 B% o: r4 E$ L. O$ f8 R% y" |5 L# K5 q
# curl -O http://www.linux.com/dodo[1-5].JPG
) P, `# c' v6 B. K5 R0 W0 n+ W' J这样就会把dodo1,dodo2,dodo3,dodo4,dodo5全部保存下来+ |* d2 L( o P; G1 f: T
* m1 h) I+ Q- i6 U$ Y. H6 u( ]8 A8.3:下载重命名
- {7 }) l) I$ K' I
. d+ m/ e/ N" R1 g# curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG( @9 n0 S8 P0 W$ K
由于下载的hello与bb中的文件名都是dodo1,dodo2,dodo3,dodo4,dodo5。因此第二次下载的会把第一次下载的覆盖,这样就需要对文件进行重命名。
1 A% d. c' M1 Q) b. C2 ^* l$ ]7 I4 M A, @
# curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG' R* m+ S1 m5 @/ U, b; H% P
这样在hello/dodo1.JPG的文件下载下来就会变成hello_dodo1.JPG,其他文件依此类推,从而有效的避免了文件被覆盖
! U5 d& b8 T# b7 a& f- @' o( `9 M: V/ l/ c, p% X
8.4:分块下载, f% ?4 X* {. @: n
有时候下载的东西会比较大,这个时候我们可以分段下载。使用内置option:-r1 j9 o' e3 K5 Z( G
$ y! U& G4 I5 R! r% u/ O" {
# curl -r 0-100 -o dodo1_part1.JPG 8 Z9 E) x3 D% | o2 N
# curl -r 100-200 -o dodo1_part2.JPG
# E3 a; l: g7 e6 |# curl -r 200- -o dodo1_part3.JPG ! J" l2 k* z# z
# cat dodo1_part* > dodo1.JPG
* f" P, W% @1 H5 M! ^5 _! E这样就可以查看dodo1.JPG的内容了
8 O6 P' d0 W1 ?- @, p, ]; W
# T K" \# e# Z N8.5:通过ftp下载文件
, @+ F) [4 h9 Fcurl可以通过ftp下载文件,curl提供两种从ftp中下载的语法! t6 |* H5 B4 H, ]! S
& U0 Y }# p$ H* d; m5 {# curl -O -u 用户名:密码
% _6 u$ @3 l$ a' W# curl -O ftp://用户名:密码@' k6 X" u6 o7 |/ P; H; [3 x
8.6:显示下载进度条4 f! }# E0 E: N, i9 ?9 I" ^! k
2 c8 ~6 d1 u; D& a% z" B# r# curl -# -O
. h4 Z" j6 r( S, e" W% {4 }8.7:不会显示下载进度信息3 H, n# m8 w& J0 S+ _
, |- y5 J+ o# Q$ }5 {) E& r
# curl -s -O
1 Q- g* e+ R& t9、断点续传
7 x+ G4 b7 V# `) t" x" q# ~在windows中,我们可以使用迅雷这样的软件进行断点续传。curl可以通过内置option:-C同样可以达到相同的效果' B: G, G! q- c9 X& h
如果在下载dodo1.JPG的过程中突然掉线了,可以使用以下的方式续传6 U* D. n0 h2 N. Y! r
4 x& [6 y2 C( |% b0 P# curl -C -O
) n- v# Z4 M4 ~9 \, k10、上传文件' u, |( h @; n) R* E" p
curl不仅仅可以下载文件,还可以上传文件。通过内置option:-T来实现
! D; ~5 D/ w. \1 Y$ l. s! S3 k1 A E0 i/ T
# curl -T dodo1.JPG -u 用户名:密码 ftp://www.linux.com/img/
3 P, A2 `4 [* j) K* X! X这样就向ftp服务器上传了文件dodo1.JPG
$ G& P5 y( G# b0 }0 r, y& E0 V J! m5 n1 ` s9 C
11、显示抓取错误
9 O8 N) l/ X# }% d
z, l. l2 T5 g) X$ u# curl -f http://www.linux.com/error
; Y- r. N( K/ ]0 j其他参数(此处翻译为转载):1 W, s/ p. Y6 X. T8 C7 e
7 B2 J' I0 I x2 U
复制代码
" `9 E: y8 I3 E/ j& g复制代码( q/ l y) K- b _% {$ F4 S+ G0 P
-a/--append 上传文件时,附加到目标文件
8 H1 ~ m4 ^6 d& ^& b$ |# E: i+ h--anyauth 可以使用“任何”身份验证方法
3 h7 ~8 z: M8 y) c) T) B--basic 使用HTTP基本验证
1 C$ I& }* d+ t3 @-B/--use-ascii 使用ASCII文本传输2 f: ^1 }- s* R: o# B
-d/--data <data> HTTP POST方式传送数据
* p% N. s8 z2 F# ^9 l/ ^- L* U--data-ascii <data> 以ascii的方式post数据
- ]+ k7 Q" p* D3 P6 `, |# C--data-binary <data> 以二进制的方式post数据$ K' M# M5 r+ Q* N# J) l( C0 o; Y
--negotiate 使用HTTP身份验证7 i1 F- W# Y$ B0 I7 A
--digest 使用数字身份验证! p; U& L; c% \ Z* `
--disable-eprt 禁止使用EPRT或LPRT( w7 C! p8 U- a. B+ b$ g1 y( i
--disable-epsv 禁止使用EPSV
8 f" x4 A4 M2 v--egd-file <file> 为随机数据(SSL)设置EGD socket路径
& u; T& B" k# j9 b8 h3 a--tcp-nodelay 使用TCP_NODELAY选项7 x4 |# B2 G4 C5 L) V
-E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)9 \5 ^5 N; y" ]! z6 C, w
--cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
: ~6 _; U0 p; H7 U( e! j--key <key> 私钥文件名 (SSL)3 k& G4 X4 _ t) Q( E3 ~
--key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)2 D B" t* E: f( ?1 K
--pass <pass> 私钥密码 (SSL)
4 M) [! A6 [8 d+ c3 p4 Z2 L& I--engine <eng> 加密引擎使用 (SSL). "--engine list" for list
: ?- A& V' P$ Z0 Q6 j4 F( K) q--cacert <file> CA证书 (SSL)
2 f8 n; d2 I- a) x--capath <directory> CA目 (made using c_rehash) to verify peer against (SSL)* A0 a4 h. X4 H8 H+ z. @
--ciphers <list> SSL密码) R" v [5 ^' | t
--compressed 要求返回是压缩的形势 (using deflate or gzip)6 e, l! {" Y+ F5 y- `% _
--connect-timeout <seconds> 设置最大请求时间$ U; ]2 F- k+ h) u- u: C7 X( x) k0 V
--create-dirs 建立本地目录的目录层次结构 r0 k( t+ z+ |
--crlf 上传是把LF转变成CRLF; v) g9 V. d6 K4 i
--ftp-create-dirs 如果远程目录不存在,创建远程目录+ p' r$ b$ G, T* R; F+ C) m& F
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
3 @- n6 V& L, O3 i' A--ftp-pasv 使用 PASV/EPSV 代替端口
1 k& z7 n1 w8 z2 [--ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址* z6 d9 B3 S+ [4 Y, K! y$ I" q
--ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输
, v2 V8 r% R; s1 s7 W0 E9 R8 M2 s- |--ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输
! p* C1 M/ D. i) J7 t( d* K3 X, e-F/--form <name=content> 模拟http表单提交数据& l& s' [& o5 e7 J/ y
-form-string <name=string> 模拟http表单提交数据
3 H u' q. @8 X# {/ l-g/--globoff 禁用网址序列和范围使用{}和[]5 b& S9 H/ ` d" @
-G/--get 以get的方式来发送数据: Z1 H. k$ U& c5 M- T9 @
-h/--help 帮助
- P: h# O" Q. s-H/--header <line> 自定义头信息传递给服务器
$ o1 P6 D. J. X% Q" s( r" }--ignore-content-length 忽略的HTTP头信息的长度) [- N: D7 \2 D
-i/--include 输出时包括protocol头信息
; `' F Z: D @5 M2 f2 D-I/--head 只显示文档信息, N& B! m! y) m) U4 @5 v2 U' c
-j/--junk-session-cookies 读取文件时忽略session cookie$ Z" P$ H( i" `; R8 h1 p9 }: j5 e
--interface <interface> 使用指定网络接口/地址
, c D4 ^4 |$ j# q$ p5 M8 H" x% _--krb4 <level> 使用指定安全级别的krb4
. `6 A& J! ?) S! |: a-k/--insecure 允许不使用证书到SSL站点6 k" e2 \; k+ Z* U# m/ I0 O; p
-K/--config 指定的配置文件读取; I6 f, k5 N1 z/ @( B- ^
-l/--list-only 列出ftp目录下的文件名称
. b% F% c+ k6 Y, Y8 D9 B0 j--limit-rate <rate> 设置传输速度
" c( r* [3 B" W M6 L; S--local-port<NUM> 强制使用本地端口号
0 @! J5 P" o/ E' |) o- g6 d-m/--max-time <seconds> 设置最大传输时间9 [' Z1 r5 ~" [7 Y
--max-redirs <num> 设置最大读取的目录数- L& p7 W6 N+ u0 j/ B( K2 A
--max-filesize <bytes> 设置最大下载的文件总量
b# a% v; O' f! ` {7 g-M/--manual 显示全手动
5 D+ c+ B- W4 w' E3 `+ y ~% \' O; p+ v-n/--netrc 从netrc文件中读取用户名和密码9 K( D, k# F6 v3 T- p0 u6 s
--netrc-optional 使用 .netrc 或者 URL来覆盖-n& u, s# {: q* ~* O3 Z( \
--ntlm 使用 HTTP NTLM 身份验证
' T/ e( h- Z$ X-N/--no-buffer 禁用缓冲输出' y3 b0 L9 c8 l6 A, k, ]
-p/--proxytunnel 使用HTTP代理: G- K9 V1 `: E% v( l F) c
--proxy-anyauth 选择任一代理身份验证方法$ ^3 c/ d3 F1 ^ @
--proxy-basic 在代理上使用基本身份验证( f% V# S2 M6 i/ c
--proxy-digest 在代理上使用数字身份验证
' \- n! O9 U0 b/ B--proxy-ntlm 在代理上使用ntlm身份验证- F K* x- ?/ Q0 o) d
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
/ g0 v; a) m" [-Q/--quote <cmd> 文件传输前,发送命令到服务器
' I9 g& M4 ?* e1 Y--range-file 读取(SSL)的随机文件
: W* }) z1 h. Q! G7 {- T-R/--remote-time 在本地生成文件时,保留远程文件时间
1 P- | N# w+ R: q' S* \--retry <num> 传输出现问题时,重试的次数' Y/ w3 G% a" {# f# L: }* r
--retry-delay <seconds> 传输出现问题时,设置重试间隔时间
9 r) S. O+ Z9 s: W4 Y1 K--retry-max-time <seconds> 传输出现问题时,设置最大重试时间
6 n! T" {9 y5 p6 i-S/--show-error 显示错误( J, W- H" s9 n
--socks4 <host[:port]> 用socks4代理给定主机和端口
$ x9 o: R) v0 k. T( Q7 u) ]& }--socks5 <host[:port]> 用socks5代理给定主机和端口5 N6 T" L3 l' }& @# S# \
-t/--telnet-option <OPT=val> Telnet选项设置
+ f9 G- g O' j- t% Y" u+ c' O--trace <file> 对指定文件进行debug
3 t8 ~8 Y! O" S1 F; r--trace-ascii <file> Like --跟踪但没有hex输出
- H. M( w) o c) W" Y--trace-time 跟踪/详细输出时,添加时间戳; b) x. q0 F" D; i+ m& A3 D' }
--url <URL> Spet URL to work with
, @% G0 X. ?+ b8 W* E% q-U/--proxy-user <user[:password]> 设置代理用户名和密码
' A. R% G; P6 N6 p-V/--version 显示版本信息+ `! f' }( V3 S3 x8 {2 R* n
-X/--request <command> 指定什么命令5 G% r7 K7 U. s! N! n* e
-y/--speed-time 放弃限速所要的时间。默认为30; A, J/ z" I3 I* S
-Y/--speed-limit 停止传输速度的限制,速度时间'秒8 s* s' |& S& P% ^# [1 S
-z/--time-cond 传送时间设置6 j0 s6 Q! j$ Z) z# Z, F6 [
-0/--http1.0 使用HTTP 1.0
/ P3 z, V0 |7 d7 f$ s$ E, b-1/--tlsv1 使用TLSv1(SSL)" Y' R2 `8 }) D w- N
-2/--sslv2 使用SSLv2的(SSL)# k+ c. o9 r. C3 Y
-3/--sslv3 使用的SSLv3(SSL)
+ F, W m- m8 V5 t7 U--3p-quote like -Q for the source URL for 3rd party transfer
1 u2 p* m6 X* n" s0 M--3p-url 使用url,进行第三方传送" B. z: M5 b* T& J3 P
--3p-user 使用用户名和密码,进行第三方传送
- o; n4 W# {4 c! ?1 @ g, ~. D6 w-4/--ipv4 使用IP4
, T/ W& j) H- ~( r, }% L-6/--ipv6 使用IP6 |
|