cURL有关HTTP的命令


文章自用,看看无妨,建议看看原文。

保存curl命令发送和接受的所有数据到文本save.txt中:

curl --trace save.txt [url]

curl --trace-ascii save.txt [url]

查看用时(毫秒):

curl --trace-ascii save.txt --trace-time [url]

重定向返回数据(默认输出到stdout):

curl [-o | -O] save.txt [url]

重置主机IP:

curl --resolve [host:port]:[new ip] [url]
curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/

显示声明端口号:

curl [url]:port
curl http://www.example.org:1234/
curl --proxy http://proxy.example.org:4321 http://remote.example.org/

用户名和密码:

curl http://user:[email protected]/
curl -u user:password http://example.org

获取页面

GET

curl https://curl.haxx.se 响应头是隐藏的

curl --include https://curl.haxx.se 在前面显示响应头信息

HEAD

curl --head(-l) http://curl.haxx.se

在一条命令行指定多个URL

curl http://url1.example.com http://url2.example.com
curl --data name=curl http://url1.example.com http://url2.example.com
数据会通过POST传送给每个URL

一个命令行使用多个URL,每个URL使用不同的请求方法

curl -l http://example.com --next http://example.com

curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html

--next类似一个分隔符,分割每个url和数据,分割的每一块相当于一个新的curl命令。

HTML表单

GET

curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=ok;"
表单所在页面的URL是www.hotmail.com/when/birth.html

POST

curl --data "birthyear=1905&press=%20OK%20" http://www.example.com/when.cgi

Content-Type=application/x-www-form-urlencoded]curl默认不会将数据编码,如果数据中包含空格,必须手动编码为%20,最新版的curl可以通过下面的参数将数据编码:

curl --data-urlencoded "name=I am Daniel" http://www.example.com

如果多次使用--data参数,curl会使用&将每个--data后面的数据合并起来。

POST文件上传





curl --form upload=@localfilename --form press=OK [url]
注意这个Content-Type是multipart/form-data。

隐藏字段

curl --data "birthyear=1905&press=OK&person=daniel" [url]
对于curl来说隐藏的字段和显示的字段都是一样的。

HTTP认证

基础认证

curl --user name:password http://www.example.com
简单的混淆,截取后还是完全可读的。

其它认证

根据响应头首部服务器可能会要求其它的认证方法,选择使用参数--ntlm--digest--negotiate--anyauth

代理认证

curl --proxy-user proxyuser:proxypassword curl.haxx.se
如果代理要求NTLM方法认证,使用--proxy-ntlm,如果是Digest方法认证,使用参数--proxy-digest。

注意

值得注意的是当一个程序运行的时候,它的参数可能通过列出系统运行的进程看到。因此,假如你把用户认证信息作为命令行的参数传入,其他用户是可以看到这些参数值的。

更多HTTP头

Referer

curl --referer [referer url] [url]
curl --referer http://www.example.come http://www.example.com
从上面也可以很容易地看出referer其实是很容易伪造的。

User Agent

让curl的请求看起来像是从Windows 2000上的IE5发出的:

curl --user-agent "Mozilla/4.0(compatible;MSIE 5.01;Windows NT 5.0)" [URL]

下面使得curl的请求看起来像是从一台老旧的Linux上Netscape4.73发出的:

curl --user-agent "Mozilla/4.73[en](X11;U;Linux2.2.15 i686)" [URL]

重定向

Location

curl --location http://www.example.com

其它重定向

浏览器一般还支持两种重定向的方法而curl不支持:一种是HTML可能会包含meta refresh标签可以让浏览器在指定时间后加载指定URL,另一种是用javascript这样做。

Cookies

Cookie参数

一个带cookie的请求:

curl --cookie "name=Daniel" http://www.example.com

通过保存响应头信息来保存cookies,可以使用--dump-header(或者-D)响应头信息:

curl --dump-header headers_and_cookies.txt http://www.example.com

使用之前保存的cookiescurl命令:

curl --cookie stored_cookies.txt http://www.example.com

贴出原文,没明白干啥:
Curl's "cookie engine" gets enabled when you use the --cookie option. If you only want curl to understand received cookies, use --cookie with a file that doesn't exist. Example, if you want to let curl understand cookies from a page and follow a location (and thus possibly send back cookies it received), you can invoke it like:

curl --cookie nada --location http://www.example.com

curl可以读写Netscape和Mozilla曾经用过的文件格式的cookie文件。--cookie(-b)可以自动识别给定的文件是否是这种文件格式并解析它,同时使用--cookie-jar(或-c)参数可以在一个请求操作之后将cookie写入一个文件。

curl --cookie cookie.txt --cookie-jar newcookie.txt http://www.example.com

HTTPS

HTTP是安全的HTTP

HTTP是建立在SSL(或者这个标准的最新版本TLS)上的HTTP,SSL会把通过网络发送和接受的数据加密,使得攻击者很难窥探敏感信息。使用curl从HTTPS服务器获得页面:

curl https://secure.example.com

认证证书

在HTTPS的世界里,除了一般的密码外使用证书证明你是谁。curl支持客户端证书。所有的证书被一个口令保护,这样在curl使用证书之前你必须通过这个口令。口令可以通过命令行声明,当curl需要使用这个证书的时候会自动进入口令验证。在HTTPS服务器上使用带证书的curl:

curl --cert mycert.pem https://secure.example.com

curl也会通过严重服务器的证书来证明服务器声明的身份,如果验证失败curl将拒绝和这个服务器连接,可以使用参数--insecure(-k)忽略服务器不能被验证。

更多关于服务器证书验证以及ca cert bundles可以参读SSLCERTS文档。

还明白什么意思,先粘贴在这里:At times you may end up with your own CA cert store and then you can tell curl to use that to verify the server's certificate:

curl --cacert ca-bundle.pem https://example.com

自定义请求元素

改变请求方法和请求头

通过--header参数可以自定义请求头,通过--request可以改变请求方法,下面的例子好好领会一下:

curl --data "" --header "Content-Type: text/xml" --request PROPFIND url.com

上面的例子将POST请求方法变成PROPFIND,发送的描述实体主体的首部由默认的Content-Type变为”Content-Type“。

可以通过提供忽略头部值的头部来删除对应首部:

curl --header "Host:" http://www.example.com

通过提供新的头部值来自定义头部,或者提供带属性值的新的头部来增加头部:

curl --header "Destination: http://anywhere.com" http://example.com

更多的关于改变请求方法

值得一提的是curl会根据请求的action来选择使用哪个请求方法,例如-d时curl会选择POST方法,-l时curl会选择HEAD方法,以此类推。假如你使用--request/-X会改变curl选择的方法关键字,但是并不会改变curl的行为。这也意味着,当你用-d"data""去作一个POST请求,你可以通过-X将方法改变为PROPFIND,但是curl还是认为它发出的是一个POST请求。可以改变默认GET方法为POST通过如下命令:

curl -X POST http://example.org

参考

RFC 7230 如果想要深入理解HTTP协议这是必读的文档
RFC 3986 解释URL语法
RFC 1867 定义HTTP基于HTML表单的文件上传
RFC 6525 定义HTTP cookies是如何工作的

你可能感兴趣的:(cURL有关HTTP的命令)