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

楼主 |
发表于 2021-11-2 16:44:31
|
显示全部楼层
命令:curl
! g: I5 {/ W+ R在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。
5 z( d) O( A3 p- R; U( f; h* \) I+ T
语法:# curl [option]
0 n0 A0 }3 @* Q4 f' p5 H. |2 V常见参数:5 v( r" c/ G ]5 X
9 y a! q* L' f& a1 K5 H
复制代码
2 m8 o9 Z, x1 O) t& b7 m$ f复制代码
$ \/ D( l! {4 m: {-A/--user-agent <string> 设置用户代理发送给服务器
6 ^& u) r" }# t( T/ S5 Y7 \-b/--cookie <name=string/file> cookie字符串或文件读取位置
2 D/ V* k; U- D- N7 P2 s+ F-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
) d: W! I, M. b g- R-C/--continue-at <offset> 断点续转
2 o& i# o- k; H! S) |9 o-D/--dump-header <file> 把header信息写入到该文件中5 y5 O- i0 H* a+ K2 G
-e/--referer 来源网址) q0 i2 J5 h9 ?* ]1 R
-f/--fail 连接失败时不显示http错误
. j+ z: v2 A( I; C- d-o/--output 把输出写到该文件中
1 D& M& J5 j* ~( s; n* i/ r-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
9 H5 r, A% d& @# x0 V4 v-r/--range <range> 检索来自HTTP/1.1或FTP服务器字节范围* k( `3 v y6 x$ ^& c/ a
-s/--silent 静音模式。不输出任何东西% }- ~% ~* w( e' U# G
-T/--upload-file <file> 上传文件8 D/ V$ W/ }+ `3 f6 z2 v8 T/ c
-u/--user <user[:password]> 设置服务器的用户和密码1 z' R4 C) n. O& G
-w/--write-out [format] 什么输出完成后 T+ ^1 W e9 \3 z
-x/--proxy <host[:port]> 在给定的端口上使用HTTP代理5 P) w' d! w; z! e7 m
-#/--progress-bar 进度条显示当前的传送状态
8 m: B1 V9 S0 P+ x+ V! \复制代码
9 a) n( e& B) F. k复制代码. L8 H* v& `5 w' y
例子:+ q, \% ^ T! x
1、基本用法: t" M" v) G' |7 ]
' _) |; a4 L1 i0 z+ E( o/ s# curl [url]http://www.linux.com' N8 R9 z R+ k& Z2 H( s3 M5 u' R2 [
执行后,www.linux.com 的html就会显示在屏幕上了
, I/ I% w, \6 W5 A4 L$ PPs:由于安装linux的时候很多时候是没有安装桌面的,也意味着没有浏览器,因此这个方法也经常用于测试一台服务器是否可以到达一个网站
- y/ Z$ S8 D: }0 L+ h4 \
$ A3 f9 ]& U" ~4 A( {+ K/ x2、保存访问的网页* W3 ~) ?- }& K+ T- j3 L) U
2.1:使用linux的重定向功能保存0 K% |$ q( s/ ^" {$ G
2 P6 T1 }/ l7 s( o% r. E/ x }# curl http://www.linux.com >> linux.html
' P6 l3 A8 s" p6 P7 F# I2.2:可以使用curl的内置option:-o(小写)保存网页
5 {! N4 ^$ D) T/ K% j, i4 h
1 a: j0 `0 D# i! t: L$ curl -o linux.html http://www.linux.com
" M4 s. F2 H ]) t0 S" E执行完成后会显示如下界面,显示100%则表示保存成功
5 e) }& U1 F. i$ |9 M
! B" i' ]% W6 o; ]+ Q# I5 n# d, U% Total % Received % Xferd Average Speed Time Time Time Current. d7 ^& w: b2 \( F; @; m$ v
Dload Upload Total Spent Left Speed2 A& ]5 ? \5 c1 _( r5 m
100 79684 0 79684 0 0 3437k 0 --:--:-- --:--:-- --:--:-- 7781k
8 ~9 A9 ?1 h" v# z2.3:可以使用curl的内置option:-O(大写)保存网页中的文件% ?% W; b! c3 ]/ }$ q4 D
要注意这里后面的url要具体到某个文件,不然抓不下来
P C- _! P- N0 i V2 ^
/ J: v( j: f7 M" u- [# curl -O http://www.linux.com/hello.sh* L4 i# q o/ D/ @6 {0 N
3、测试网页返回值
) A$ p2 Y( u+ _+ I& B! u" e- X5 {% |
# curl -o /dev/null -s -w %{http_code} www.linux.com
' y! m4 W' P5 O6 S' p9 z9 [. H# HPs:在脚本中,这是很常见的测试网站是否正常的用法4 i9 \$ e, |6 ?$ H) X; y& [' F
# F2 B- ?; T4 w7 W( O$ u4、指定proxy服务器以及其端口
, v/ C, f. L' e: |$ Z2 y+ C% a$ b( h很多时候上网需要用到代理服务器(比如是使用代理服务器上网或者因为使用curl别人网站而被别人屏蔽IP地址的时候),幸运的是curl通过使用内置option:-x来支持设置代理
2 c! Q5 P+ z, p- c- V1 r z) O( |: g% B+ F/ I' T
# curl -x 192.168.100.100:1080 http://www.linux.com" W: `: G0 T$ d! ^0 R5 m: n
5、cookie
. A9 C% Y4 D4 G+ g) P有些网站是使用cookie来记录session信息。对于chrome这样的浏览器,可以轻易处理cookie信息,但在curl中只要增加相关参数也是可以很容易的处理cookie* r& R2 H0 X* j" k+ F" j8 d; ]
5.1:保存http的response里面的cookie信息。内置option:-c(小写)2 ^6 t- }: D) X& k0 W7 E; y5 }
; K5 a/ ^- D/ V. I4 `7 g0 {
# curl -c cookiec.txt http://www.linux.com- r- P& M1 Y7 o0 W' ~, g, E
执行后cookie信息就被存到了cookiec.txt里面了
! x( K% U: D5 e/ t% {' P9 i" ?" r% N0 p2 `
5.2:保存http的response里面的header信息。内置option: -D
2 q! o8 w1 k6 s, g8 i! d! y+ r7 e7 F- l6 q: _0 a
# curl -D cookied.txt http://www.linux.com
$ E3 X9 i @, F& ^执行后cookie信息就被存到了cookied.txt里面了
2 _; m, W3 A: _& l M# q5 i' l. k4 M4 t/ }- V4 z; J: o
注意:-c(小写)产生的cookie和-D里面的cookie是不一样的。 W# U( U! K6 v W
5 Q e: }% n1 T9 R+ X4 R, ]( w' V' T5 h" |
3 ?$ f! }8 S4 {, G) ]3 X0 {
5.3:使用cookie6 i6 u! I: _; P5 o* ]$ B: q8 x; G
很多网站都是通过监视你的cookie信息来判断你是否按规矩访问他们的网站的,因此我们需要使用保存的cookie信息。内置option: -b
- \& R; w* _2 R7 D- T2 [
; ~0 ?' I& g7 Y* J" `/ }# curl -b cookiec.txt http://www.linux.com
9 p3 R1 R y" P4 w0 \+ H; `# c6、模仿浏览器; p8 z% g. s3 r6 K, ]& Q
有些网站需要使用特定的浏览器去访问他们,有些还需要使用某些特定的版本。curl内置option:-A可以让我们指定浏览器去访问网站/ Z4 ?5 O1 R$ c( O+ M
2 z& p* N/ M* G& e; n6 w+ u# i# curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com
6 F4 H1 T' Z# W0 ?9 [5 C7 r这样服务器端就会认为是使用IE8.0去访问的- c0 D' z# u z1 s* ^8 N$ W
' G1 @4 D c' `! v+ h9 l, _
7、伪造referer(盗链)9 {# X: t7 x) d) Y/ E8 l: i. S
很多服务器会检查http访问的referer从而来控制访问。比如:你是先访问首页,然后再访问首页中的邮箱页面,这里访问邮箱的referer地址就是访问首页成功后的页面地址,如果服务器发现对邮箱页面访问的referer地址不是首页的地址,就断定那是个盗连了3 w9 P* v X% h
curl中内置option:-e可以让我们设定referer: [5 \, P/ M' y+ y( S- L
* d* G5 z4 x* `7 e5 G7 S# curl -e "www.linux.com" http://mail.linux.com
$ w& t& u+ H% [这样就会让服务器其以为你是从www.linux.com点击某个链接过来的9 A5 l& s! m- h) B+ {2 @$ K
+ e! ]& o# L( M8、下载文件4 K% P( u, X7 f, E4 l
8.1:利用curl下载文件。' q0 |, M" o- \ @% }& R4 ^$ ]
#使用内置option:-o(小写)" k8 w8 o7 _, s! v M4 `4 Y+ Z8 Y
- b9 `6 L, U+ h( j8 |
# curl -o dodo1.jpg http:
8 v7 L- S/ v- l @: z0 }#使用内置option:-O(大写)+ U' ]3 V8 v8 L7 u
$ w. ?% |+ L4 X2 F
# curl -O
1 @7 a; p9 X$ s" I+ e& g这样就会以服务器上的名称保存文件到本地
. L* p$ c# O( e) x+ h5 v0 N! a( }# W5 z& V9 G
8.2:循环下载
, W. H1 h/ z, S. J7 M有时候下载图片可以能是前面的部分名称是一样的,就最后的尾椎名不一样! Y& w: P2 A0 i, t: F
6 X- {5 M- y% R& u) @
# curl -O http://www.linux.com/dodo[1-5].JPG
8 U5 M; y2 }- V8 |5 m; ^这样就会把dodo1,dodo2,dodo3,dodo4,dodo5全部保存下来
- y2 W x# F9 h* w: M: l& P
, B4 E4 j% V( B8 @, O9 \* m8.3:下载重命名) h! _! D/ M- s+ U! d: [/ }
) h/ e. |5 h# q# R. B
# curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG
. n, Y# t4 B$ T6 P3 R由于下载的hello与bb中的文件名都是dodo1,dodo2,dodo3,dodo4,dodo5。因此第二次下载的会把第一次下载的覆盖,这样就需要对文件进行重命名。; X+ b$ t; j+ d4 Q6 K' U4 T
6 }/ D O$ _, J; C+ G' _; A! M$ m, i
# curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG
8 \& _+ x- ?/ I0 J+ `) Z这样在hello/dodo1.JPG的文件下载下来就会变成hello_dodo1.JPG,其他文件依此类推,从而有效的避免了文件被覆盖 ~0 M; {+ S/ e0 l
' Y4 a/ q/ s) Q3 I7 L' f7 \: i
8.4:分块下载
9 @/ u% X4 o1 b, S2 k& q8 [有时候下载的东西会比较大,这个时候我们可以分段下载。使用内置option:-r/ X' B( r6 ]- t9 H4 _2 M$ |9 }
$ n% R0 p/ m5 D( y. v# curl -r 0-100 -o dodo1_part1.JPG # g9 @# f) {8 ~1 [! c
# curl -r 100-200 -o dodo1_part2.JPG - r/ o) x" a4 r" o @
# curl -r 200- -o dodo1_part3.JPG ; v* {! T; r0 n# `& T3 w
# cat dodo1_part* > dodo1.JPG
1 T& ^- N0 H8 i+ v这样就可以查看dodo1.JPG的内容了" z0 c6 s9 _! Z7 `2 ]: l/ H; W! M
" q u( H! Y8 \$ ?: ~/ O' N
8.5:通过ftp下载文件
8 W: S* N9 Q, d7 l3 b' w$ bcurl可以通过ftp下载文件,curl提供两种从ftp中下载的语法
{/ z/ W# D( P ]- ~- Q
1 w- H3 O5 Y% ?& @: @# curl -O -u 用户名:密码
9 h2 w, C( Q& m& a# curl -O ftp://用户名:密码@
% [) I. @( n( c% n8.6:显示下载进度条& K( G% Y0 O2 G: y9 m
# G+ X2 }5 K! G% m- m! Y% y7 _
# curl -# -O
1 T: e4 y$ E/ W/ ^8 s8.7:不会显示下载进度信息
. c0 M- c0 [+ t4 l, p, q3 @+ P. l" E& }
# curl -s -O
2 v; T' y% J+ B! P& E9、断点续传7 N; k P6 c0 k/ b- {9 |: B$ b
在windows中,我们可以使用迅雷这样的软件进行断点续传。curl可以通过内置option:-C同样可以达到相同的效果$ K7 O* { \, Q) p% \
如果在下载dodo1.JPG的过程中突然掉线了,可以使用以下的方式续传
* N1 o* E& U( W. `" i: H
0 \( X, v* I2 C( X( [; p" n# curl -C -O
% y9 v( I8 A/ x; i. e9 ]10、上传文件
$ ~- ^9 q; v( Zcurl不仅仅可以下载文件,还可以上传文件。通过内置option:-T来实现
2 y! G# t% N; v7 C$ k5 F$ u* h$ V H% ?. B; Y! V
# curl -T dodo1.JPG -u 用户名:密码 ftp://www.linux.com/img/* |5 M2 x0 G) J! s
这样就向ftp服务器上传了文件dodo1.JPG
% Y" I. G/ P9 X, E! U( A* n% R& n: l9 T5 D# Q+ W% |6 D+ B
11、显示抓取错误. | J$ Y) z) ?' L2 _) O$ I4 h
|! V6 w, Y/ K$ A+ x, q# curl -f http://www.linux.com/error
, D; B* x m+ I s, h ~2 Z其他参数(此处翻译为转载):
D9 r- Y8 x6 |
( N% d9 W4 [% \( J8 ^# I- O复制代码8 Y! ^* i# e# \; \
复制代码
. ~1 w; N/ k* H3 `( e9 v-a/--append 上传文件时,附加到目标文件
\! [8 I9 k' i! [- a--anyauth 可以使用“任何”身份验证方法3 J8 G: X/ }) V# U+ y v
--basic 使用HTTP基本验证
2 w1 y: }% B! R: L0 D-B/--use-ascii 使用ASCII文本传输
& b( v# Z8 {/ e- T-d/--data <data> HTTP POST方式传送数据. ^# D N% _7 T4 q; [7 H1 z
--data-ascii <data> 以ascii的方式post数据
+ c6 [0 T- A0 e' A) k--data-binary <data> 以二进制的方式post数据
c" j) M3 ]& h8 h! Z--negotiate 使用HTTP身份验证9 s* `/ z+ ~% V+ }3 D; T1 p! S% ~
--digest 使用数字身份验证. ^* m6 }, b) r" w, ] F$ w
--disable-eprt 禁止使用EPRT或LPRT( q/ t# \( C: a# P
--disable-epsv 禁止使用EPSV' p4 x' v# h" z
--egd-file <file> 为随机数据(SSL)设置EGD socket路径' A5 ]3 f! Z2 [ H
--tcp-nodelay 使用TCP_NODELAY选项
/ W6 M0 ]) {0 R- l& K) F* ]6 _. |-E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL); G) }& H, K7 K# X7 Z
--cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
4 M# l; q' g9 O' L* t--key <key> 私钥文件名 (SSL)
6 {4 _! _6 ]1 @- J4 J. H* g4 c--key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)
! E+ ^* r6 q; k3 f7 ~--pass <pass> 私钥密码 (SSL)( _" X* D2 I# t. U) B0 w
--engine <eng> 加密引擎使用 (SSL). "--engine list" for list
5 v3 ^" e- c4 F" w( G- x1 }3 |--cacert <file> CA证书 (SSL)
, L2 ?& I" D: b5 b$ z0 ]. c--capath <directory> CA目 (made using c_rehash) to verify peer against (SSL)1 B/ L& {( n7 n& r P$ U) }
--ciphers <list> SSL密码# v8 @9 }+ T8 B Y. z
--compressed 要求返回是压缩的形势 (using deflate or gzip)6 ?2 r: u# z" d( v) w2 g9 Q
--connect-timeout <seconds> 设置最大请求时间
/ h6 a" \6 y& |--create-dirs 建立本地目录的目录层次结构
1 m1 r4 w3 g ?--crlf 上传是把LF转变成CRLF$ d7 P5 M; _4 @* m" h$ j* N
--ftp-create-dirs 如果远程目录不存在,创建远程目录
# ?2 V5 l X. W& n( C--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
: E6 \7 k/ J+ i6 d" Z--ftp-pasv 使用 PASV/EPSV 代替端口* ?1 i Y3 E7 g
--ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址% f4 c! _; J k& x O: X' ~4 H/ t
--ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输 J. L+ W9 W2 ?, }+ N/ I; B
--ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输6 ~7 y) S. g/ j5 Z( S
-F/--form <name=content> 模拟http表单提交数据; |! v! M! p0 R; r$ H
-form-string <name=string> 模拟http表单提交数据
9 n% y5 Q+ r& A( B, O. h-g/--globoff 禁用网址序列和范围使用{}和[]
, A4 }' t6 }. K-G/--get 以get的方式来发送数据: W! \! v; l2 y8 a6 a# B
-h/--help 帮助% ^: r5 \5 h6 p- }- M( q; B
-H/--header <line> 自定义头信息传递给服务器
0 F: [! ~- ]% D9 _2 Q e--ignore-content-length 忽略的HTTP头信息的长度2 s, Z( T0 O* n* Q. u8 x, _$ J
-i/--include 输出时包括protocol头信息+ k) {2 u! p4 W8 H$ z1 x
-I/--head 只显示文档信息
3 c2 V1 ~& l' g7 s7 D-j/--junk-session-cookies 读取文件时忽略session cookie
8 k5 Y& l1 O/ d- _1 }- B--interface <interface> 使用指定网络接口/地址
, q! c/ |! m; E+ n--krb4 <level> 使用指定安全级别的krb4# M! i; k# J* K0 y
-k/--insecure 允许不使用证书到SSL站点
8 Q" Q/ D q3 i) D8 [-K/--config 指定的配置文件读取( h- V3 Z$ \+ y. E/ j8 E
-l/--list-only 列出ftp目录下的文件名称
: f% h. U! Y! S/ z--limit-rate <rate> 设置传输速度
. ?0 q& R1 ]. O; z--local-port<NUM> 强制使用本地端口号
9 Z2 H9 L Q( l) Q8 c-m/--max-time <seconds> 设置最大传输时间5 u. V6 ^# [% W+ a1 k6 o
--max-redirs <num> 设置最大读取的目录数# `( g( r- V' u4 _1 S1 p- X Y
--max-filesize <bytes> 设置最大下载的文件总量1 o+ I6 ?3 C6 X
-M/--manual 显示全手动7 A" O0 S6 Q4 G: c* v
-n/--netrc 从netrc文件中读取用户名和密码
: }# ]7 L; m5 E1 P% Q: f6 W--netrc-optional 使用 .netrc 或者 URL来覆盖-n. _. x3 Q7 ]* y& p" I2 P
--ntlm 使用 HTTP NTLM 身份验证! H8 S. @7 g! K
-N/--no-buffer 禁用缓冲输出
. z* B3 {* }5 W: \6 U6 r4 g-p/--proxytunnel 使用HTTP代理7 @. l/ u7 \- c$ N
--proxy-anyauth 选择任一代理身份验证方法( `( h7 g- ?) H
--proxy-basic 在代理上使用基本身份验证" ]2 C1 p& u# j& l
--proxy-digest 在代理上使用数字身份验证
1 e( I; F# m) h0 V7 y--proxy-ntlm 在代理上使用ntlm身份验证* d% Y9 c5 p l; ]- Q9 w
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
. j# g, |6 H0 j0 z! K) a. ]-Q/--quote <cmd> 文件传输前,发送命令到服务器! _1 j3 W) S; a: |8 j6 K. [
--range-file 读取(SSL)的随机文件
7 _! [; W" b/ n! j* o3 ^-R/--remote-time 在本地生成文件时,保留远程文件时间
, w+ a! A! {9 h6 d, l--retry <num> 传输出现问题时,重试的次数2 U6 k2 J1 Y5 I) a/ @
--retry-delay <seconds> 传输出现问题时,设置重试间隔时间) V/ x9 ^2 S) p$ k7 H7 E& Y+ ?
--retry-max-time <seconds> 传输出现问题时,设置最大重试时间# b3 Q/ d1 m! I9 s3 z6 Y& N
-S/--show-error 显示错误
2 Y: A3 ?" M" Z! I--socks4 <host[:port]> 用socks4代理给定主机和端口0 U# t; B( [3 E1 [3 ^ O) }* e9 \
--socks5 <host[:port]> 用socks5代理给定主机和端口
, { f4 {1 k4 m9 |9 A1 `$ U-t/--telnet-option <OPT=val> Telnet选项设置
; k2 }/ F/ [: ]+ A5 J1 S--trace <file> 对指定文件进行debug/ |! Y o5 m/ N: Q
--trace-ascii <file> Like --跟踪但没有hex输出
) _+ t' }& `6 z3 |. x; M--trace-time 跟踪/详细输出时,添加时间戳+ H# n4 B u @+ P! a# c( O, ^
--url <URL> Spet URL to work with
3 a7 z9 @/ D/ l& R# ^-U/--proxy-user <user[:password]> 设置代理用户名和密码% f; J* N6 i5 b, N3 {
-V/--version 显示版本信息
- l1 H" ]0 c8 t5 P-X/--request <command> 指定什么命令
; H9 P/ b* w2 ~( r, P3 B0 g' U& D" I-y/--speed-time 放弃限速所要的时间。默认为30$ T4 o! w- f0 _# D# S0 \
-Y/--speed-limit 停止传输速度的限制,速度时间'秒$ S4 c* ]; Z# `
-z/--time-cond 传送时间设置
7 o8 q: w' j5 J$ K) d-0/--http1.0 使用HTTP 1.0. n) r! ?" T }; k
-1/--tlsv1 使用TLSv1(SSL)
- U/ n, J3 Y* g5 h2 e-2/--sslv2 使用SSLv2的(SSL)& E5 Z: X. x$ @- ?" {9 s+ i( @2 B
-3/--sslv3 使用的SSLv3(SSL) L. F2 ?7 g/ i5 s Y
--3p-quote like -Q for the source URL for 3rd party transfer' ]7 V, F2 h2 _
--3p-url 使用url,进行第三方传送$ [$ z; B7 Y# x2 ^
--3p-user 使用用户名和密码,进行第三方传送
# B' U7 I; L( B; i! m$ f-4/--ipv4 使用IP4
8 p3 @$ b/ c1 R3 a9 e: a-6/--ipv6 使用IP6 |
|