程序与技术分享:Curl命令详解

简介: 程序与技术分享:Curl命令详解

什么是Curl?


cURL是在命令行下工作的文件传输工具。


他的语法是基于URl的语法。


它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。


cURL还包含了用于程序开发的libcurl。


Curl支持协议


cURL支持的通信协议有:


FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。


curl还支持SSL认证、HTTP POST、HTTP PUT、FTP上传,


HTTP form based upload、proxies、HTTP/2、cookies、用户名+密码认证(Basic, Plain, Digest, CRAM-MD5, NTLM,


Negotiate and Kerberos)、file transfer resume、proxy tunneling。


Curl场景使用


HTTP方法


在每一个HTTP请求中,都有一个对应的方法,常用的方法有:GET、POST、HEAD和PUT。


如果在一个curl命令中不指定具体的方法,那么默认的就是使用GET方法。对于其它的方法,可以在curl命令中指定:


methodoption


POST


-d或-F


HEAD


-I


PUT


-T


Header


在curl中,使用 -i 选项可以显示Response的Header信息,连同Body数据:


$ curl -i


结果:


HTTP/1.1 200 OK


Accept-Ranges: //代码效果参考:http://hnjlyzjd.com/xl/wz_24199.html

bytes

Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform


Connection: Keep-Alive


Content-Length: 2381


Content-Type: text/html


Date: Mon, 17 Sep 2018 10:26:42 GMT


Etag: "588604dd-94d"


Last-Modified: Mon, 23 Jan 2017 13:27:57 GMT


Pragma: no-cache


Server: bfe/1.0.8.18


Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/


<!DOCTYPE html

[span class="hljs-name">htmlheadmeta http-equiv=content-type content=text/html;charset=utf-8meta


http-equiv=X-UA-Compatible content=IE=Edgemeta content=always //代码效果参考:http://hnjlyzjd.com/xl/wz_24197.html

name=referrerlink rel=styleshee

t type=text/css href=title

知道body link=#0000cc

使用 -I 选项可以只显示Response的Header信息:


$ curl -I www.baidu.com


POST


POST是HTTP中向服务端提交数据的一种方法。


在浏览器中,但在表单中填写完数据后,浏览器就会默认将填写的数据使用 key=value 串的形式进行转化。


在curl中,我们可以使用 -d 或 –data 选项来指定具体的数据:


$ curl -d key1=value1&key2=value2 http://example.com


我们也可以使用多个 -d 选项来指定多组数据,curl会自动把这些数据连接起来,因此上面的例子还可以这样:


$ curl -d key1=value1 -d key2=value2 http://example.com


当然,如果数据过多,我们还可以把数据放在一个文件中:


$ curl -d @filename http://example.com


Content-Type


当使用POST方法提交数据时,对于提交的数据主要有如下四种形式:


application/x-www-form-urlencoded:默认的形式,即key1=value1&key2=value2的形式;


multipart/form-data:使用表单上传文件时使用这个形式;


application/json:提交JSON格式的数据;


text/xml:提交XML格式的数据。


Content-Type是一个Header,如果不指定的话,那么默认就是使用application/x-www-form-urlencoded形式传输数据,


当需要使用别的形式进行数据传输的话,那么就需要指定这个Header:


$ curl -d '{I Am A JSON FORM}' -H 'Content-Type: application/json' http://example.com


其中,-H就是用来指定一个具体的Header的选项,值就是key=value 的形式。当需要指定其它的Header,可以使用-H选项。


POST一个二进制数据


在curl中,我们也可以提交一个文件,可以使用–data-binary选项来指定一个文件:


$ curl --data-binary @filename http://example.com


转化成一个GET


使用-G或-get选项,可以把一个POST请求转化成一个GET请求。如果有-d选项指定的参数,那么curl就会把-d后面的数据添加到URL的后面,用?连接。比如:


$ curl -d "key1=value1" -G http://example.com


得到的请求URL就是:


http://example.com/?key1=value1


URL编码


如果使用的数据没有编码,那么可以指定curl来帮助自己进行编码。这时可以使用 –data-urlencode 选项来指定。比如:


$ curl --data-urlencode "name=Alan Walker" http://example.com


multipart formposts


如果一个HTTP POST具有如下形式的表单:


[span class="hljs-name">form action="submit.cgi" method="post" enctype="multipart/form-data"

Name: [span class="hljs-name">input type="text" name="person"br

File: [span class="hljs-name">input type="file" name="secret"br

[span class="hljs-name">input type="submit" value="Submit"


用户可以在Name中填写名字,在File中选择一个文件,然后单击Submit按钮提交数据。


为了可以在curl中模拟这个请求,我们可以使用-F或–form选项来指定数据:


$ curl -F person=annonymous -F secret=@filename http://example.com/submit.cgi


在上面的表单中,action指定了这个请求发送到哪里;method指定这是一个POST请求;而enctype指定了这是一个multipart formpost。


当执行上面的curl命令后,curl会产生如下的请求头:


POST /submit.cgi HTTP/1.1


Host: example.com


User-Agent: curl/7.46.0


Accept: /


Content-Length: 313


Content-Type: multipart/form-data; boundary=------------------------d74496d66958873e


其中Content-Type是和enctype一致的。


当使用-F选项时,默认的Content-Type就是multipart/form-data,不过,我们也可以使用-H进行指定:


$ curl -F 'name=Dan' -H 'Content-Type: multipart/magic' https://example.com


-d vs -F


在前面我们介绍了使用-d构造一个基本的POST请求,和-F构造一个multipart formpost请求。那么这两个选项有啥区别以及什么时候使用呢?


这两个选项都是把指定的数据发送到服务器上,区别在于数据传递的格式。大多数时候,接收端来指定希望客户端发送数据的格式,客户端不能随意自己指定格式。


HTML表单


当使用HTML表单时,会使用


标签指定一个表单,这会让浏览器使用POST方法。如果标签中含有enctype=multipart/form-data,


这意味着使用multipart formpost方式,在curl中就是使用-F选项。一个典型的场景就是表单中含有标签。


不用HTML表单


POST方法不一定非要在HTML中,在好多的service、APIs中,也可以使用POST请求。


如果这些service期望使用JSON或者其它类似的格式的数据,那么这就是一个普通的POST请求。


在curl中就可以使用-d选项。不过要注意-d的默认Content-Type是不是期望的格式,如果不是的话,可以使用-H进行更改。


HTTP重定向(redirect)


重定向是HTTP协议中的一个基础部分。在重定向中,服务器给客户端的并不是客户端想要的内容,


而是一个车具体的指令,告诉客户端如果想获取想要的数据,应该到哪里去请求。


但不是所有的重定向都一样。重定向之后的请求使用什么方法呢?重定向多久呢?


所有的重定向都会返回Location:的Header,来指定一个新的URL。


curl:redirect


在curl中,默认不会重定向,可以使用-L或–location选项来告诉curl重定向:


$ curl -L http://example.com


GET还是POST


第一次请求后,服务器会告诉客户端下一次请求需要使用的方法。关于重定向的响应码如下:


MethodPermanentTemporary


切换到GET


301


302和303


使用第一次请求的方法


308


307


我们可以指定curl在重定向时使用什么方法。


如果我们第一次请求使用的不是GET方法,重定向后也不希望curl默认使用GET方法,那么我们可以使用–post301,–post302和–post303选项来指定。


修改HTTP请求


每一个请求都有一个请求行、一些请求头和可选的请求体,这里我们看看在curl中可以具体修改的部分,包括请求行和请求头。


请求方法


在请求行中包含这次请求所使用的方法。我们使用下面的简单命令就可以进行一个GET方法:


$ curl http://example.com/file


这会生成如下的请求行:


GET /file HTTP/1.1


在HTTP方法中我们可以通过具体的选项指定使用什么方法。这里我们也可以使用-X选项来进行指定:


$ curl -X POST http://example.com


修改请求头


在curl中,我们可以使用-H或–header选项来指定Header。之前我们就使用-H指定了Content-Type,其实Header就是一个key: value对:


$ curl -H "HeaderName: HeaderValue" http://example.com


Referer


我们还可以在curl通过–referer选项来指定我们是从哪里跳转过来的:


$ curl --referer http://fromexample.com http://toexample.com


User Agent


这个字段是用来表示客户端的设备信息的,服务器会根据这个字段,针对不同的设备,返回不同格式的网页。在curl中,可以使用–user-agent选的来指定:


$ curl --user-agent "【User Agent】" http://example.com


Cookies


HTTP是一种无状态的协议,为了在会话中保存一些状态,可以使用Cookies。服务器通过Set-Cookie:来设置Cookie,客户端就可以在下一次请求中携带这些数据。


设置Cookie


我们可以使用–cookie选项来设置一个Cookie:


$ curl --cookie "CookieName=CookieValue" http://example.com


从文件中读取Cookies


curl默认不会记住服务器设置的Cookie,也不会在下一次请求中携带Cookie。除非用户通过选项自己设置。


我们可以把之前的Cookies保存到一个文件,然后在下一次请求中指定curl读取文件中的Cookies:


$ curl -b cookies.txt http://example.com


-b选项指定curl去给定的文件中读取Cookies。


不过要主要,这里仅仅是读取Cookies,如果这次请求中服务器修改了Cookie,那么curl是不会进行保存的,除非我们手动指定。


写Cookies到文件


我们可以使用-c选项指定curl保存这次请求中服务器设置的Cookies:


$ curl -c cookie.jar.txt http://example.com


有时,我们既需要从文件中读取Cookies,也需要保存服务器设置的Cookies。那么就可以同时使用-b和-c选项:


$ curl -b cookies.txt -c cookie.jar.txt http://example.com


工具转换


Chrome


在Chrome中,打开More tools->Developer模式,


选择Network选项卡,然后就可以看到所有的请求,选中相应的请求,右键就有Copy as cURL选项,单击就可以了。


复制出来的结果如下:


curl '' \


-H 'Connection: keep-alive' \


-H 'Accept: application/json, text/javascript, /; q=0.01' \


-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36' \


-H 'Sec-Fetch-Site: same-origin' \


-H 'Sec-Fetch-Mode: cors' \


-H 'Sec-Fetch-Dest: empty' \


-H 'Referer: ' \


-H 'Accept-Language: zh-CN,zh;q=0.9' \


-H 'Cookie: BIDUPSID=CC7B33A0192F00B390F121986B2F17F4; PSTM=1576163232; BAIDUID=CC7B33A0192F00B33DCFAA82F58706DB:FG=1; BDUSS=xUVGtDSzdwQVlGT1cxcGpSUGtreVg3bGdXNnJEQW83TW16OGF6NzZKdXh3aDllSVFBQUFBJCQAAAAAAAAAAAEAAAB-tN0E6dnA6MPOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALE1-F2xNfhdN2; MCITY=-%3A; BD_UPN=123253; COOKIE_SESSION=8366_0_8_5_3_14_0_1_8_1_0_2_21552_0_1_0_1593346129_0_1593346128%7C9%237395222_271_1591328239%7C9; BD_HOME=1; delPer=0; BD_CK_SAM=1; PSINO=5; H_PS_PSSID=1421_31670_32139_31253_32045_31640; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDRCVFR【feWj1Vr5u3D】=mk3SLVN4HKm; H_PS_645EC=9e81xM8yrPa1O7oMg2rlWLBCpc%2Fir5Ui5T3YIjWLt6FgLOUupOcgrB80vPdGV3EavmJj; WWW_ST=1593599945002; sug=3; sugstore=1; ORIGIN=0; bdime=0' \


--compressed


Fiddler


右上角 File-> Export Sessions -> Selected Sessions


选项第一个默认 cURL script -next


文件名自己定义,保存到电脑本地


login.bat 的内容可以打开,复制出来


curl -k -i --raw -o 0.dat -X POST "" -H "User-Agent: Fiddler" -H "Content-Type: application/json" -H "Host: 49.x.x.x:6000"


Charles


先抓到你想要导出的接口。


如果导出的curl不能使用,先查看导出的信息。


curl -H 'Host: xxx.com' -H 'Accept: application/json' -H 'User-Agent: kwai-ios' -H 'Accept-Language: zh-Hans-CN;q=1' --compressed ''


问题出现在结尾网址,请将结尾网址提到最前面就可以了。


curl '' -H 'Host: xxx.com' -H 'Accept: application/json' -H 'User-Agent: kwai-ios' -H 'Accept-Language: zh-Hans-CN;q=1' --compressed


Postman


在请求右边点击 Code


选择cUrl,右边就会展示转换后的内容。


Curl参数详解


-A


-A参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/【version】。


$ 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'


上面命令将User-Agent改成 Chrome 浏览器。


$ curl -A ''


上面命令会移除User-Agent标头。


也可以通过-H参数直接指定标头,更改User-Agent。


$ curl -H 'User-Agent: php/1.0'


-b


-b参数用来向服务器发送 Cookie。


$ curl -b 'foo=bar'


上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。


$ curl -b 'foo1=bar;foo2=bar2'


上面命令发送两个 Cookie。


$ curl -b cookies.txt


上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。


-c


-c参数将服务器设置的 Cookie 写入一个文件。


$ curl -c cookies.txt


上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。


-d


-d参数用于发送 POST 请求的数据体。


$ curl -d'login=emma&password=123'-X POST


# 或者


$ curl -d 'login=emma' -d 'password=123' -X POST


使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。


-d参数可以读取本地文本文件的数据,向服务器发送。


$ curl -d '@data.txt'


上面命令读取data.txt文件的内容,作为数据体向服务器发送。


–data-urlencode


–data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。


$ curl --data-urlencode 'comment=hello world'


上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。


-e


-e参数用来设置 HTTP 的标头Referer,表示请求的来源。


curl -e ''


上面命令将Referer标头设为


-H参数可以通过直接添加标头Referer,达到同样效果。


curl -H 'Referer: '


-F


-F参数用来向服务器上传二进制文件。


$ curl -F 'file=@photo.png'


上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。


-F参数可以指定 MIME 类型。


$ curl -F 'file=@photo.png;type=image/png'


上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。


-F参数也可以指定文件名。


$ curl -F 'file=@photo.png;filename=me.png'


上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。


-G


-G参数用来构造 URL 的查询字符串。


$ curl -G -d 'q=kitties' -d 'count=20'


上面命令会发出一个 GET 请求,实际请求的 URL 为如果省略--G,会发出一个 POST 请求。


如果数据需要 URL 编码,可以结合–data–urlencode参数。


$ curl -G --data-urlencode 'comment=hello world'


-H


-H参数添加 HTTP 请求的标头。


$ curl -H 'Accept-Language: en-US'


上面命令添加 HTTP 标头Accept-Language: en-US。


$ curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy'


上面命令添加两个 HTTP 标头。


$ curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json'


上面命令添加 HTTP 请求的标头是Content-Type: application/

相关文章
|
2天前
|
存储 安全 开发者
程序与技术分享:Catel帮助手册
程序与技术分享:Catel帮助手册
|
2天前
|
存储 人工智能 算法
程序与技术分享:7z命令行压缩解压详解
程序与技术分享:7z命令行压缩解压详解
|
1月前
|
安全 Linux Shell
Linux常用命令详解与实战应用
【5月更文挑战第7天】本文详述了Linux常用命令,包括文件与目录操作(ls, cd, pwd, cp, mv, rm)、文本处理(cat, grep, sed)及系统管理(top, df, du)命令。通过实例演示了如何使用这些命令,帮助读者理解和掌握Linux操作,提升系统管理效率。学习和熟练运用这些基础命令,是高效使用Linux的关键。
|
1月前
|
JSON API 数据格式
从基础到高级,带你深入了解和使用curl命令(四)
本文介绍了如何使用curl命令发送GET和POST请求。发送GET请求的基本语法是`curl [URL]`,加参数时使用`&`连接。添加`-v`参数可显示详细输出。发送POST请求,使用`-X POST -d`传表单数据,或`-d -H &quot;Content-Type: application/json&quot;`发送JSON数据,用`-F &quot;file=@path&quot;`上传文件,`--data-binary`用于上传二进制数据。curl是一个功能强大的HTTP请求工具,适用于各种网络通信需求。
27 1
|
1月前
|
编解码 Linux 数据安全/隐私保护
linux工具之curl与wget高级使用
linux工具之curl与wget高级使用
|
1月前
|
网络安全 数据安全/隐私保护
从基础到高级,带你深入了解和使用curl命令(三)
使用curl命令轻松实现文件上传和下载。上传文件:`curl -F &quot;file=@/path/to/upload/file&quot; http://example.com/upload`;下载文件:`curl -O http://example.com/file-to-download.zip`。自定义文件名:`curl -o myFile.zip http://example.com/file-to-download.zip`。支持断点续传 `-C -` 和HTTPS下载。需认证时,使用`-u username:password`。curl,强大且灵活的文件传输工具。
58 0
|
1月前
|
API
从基础到高级,带你深入了解和使用curl命令(一)
`curl`命令是网络通信中的强大工具,用于与HTTP、HTTPS、FTP等协议交互,支持多种操作。基本语法是`curl [options] [URL]`,包含如`-A`设置用户代理,`-b`处理cookie,`-o`保存输出到文件,`-x`指定代理等选项。示例包括请求网址、保存网页、使用代理及模仿浏览器访问。本文为`curl`基础用法介绍,后续将探讨更多高级功能。
27 0
|
1月前
|
Linux 定位技术
Linux命令(77)之curl
Linux命令(77)之curl
40 1
|
Linux
Linux实战笔记(一) curl基本使用
Linux实战笔记(一) curl基本使用
236 0
服务器上--Linux常用命令学习
服务器上--Linux常用命令学习