文章自用,看看无妨,建议看看原文。
保存curl命令发送和接受的所有数据到文本save.txt中:
<pre>curl --trace save.txt [url]</pre>
<pre>curl --trace-ascii save.txt [url]</pre>
查看用时(毫秒):
<pre>curl --trace-ascii save.txt --trace-time [url]</pre>
重定向返回数据(默认输出到stdout):
<pre>curl [-o | -O] save.txt [url]</pre>
重置主机IP:
<pre>curl --resolve [host:port]:[new ip] [url]
curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/</pre>
显示声明端口号:
<pre>curl [url]:port
curl http://www.example.org:1234/
curl --proxy http://proxy.example.org:4321 http://remote.example.org/</pre>
用户名和密码:
<pre>curl http://user:password@example.org/
curl -u user:password http://example.org</pre>
获取页面
GET
<pre>curl https://curl.haxx.se 响应头是隐藏的</pre>
<pre>curl --include https://curl.haxx.se 在前面显示响应头信息</pre>
HEAD
<pre>curl --head(-l) http://curl.haxx.se</pre>
在一条命令行指定多个URL
<pre>curl http://url1.example.com http://url2.example.com
curl --data name=curl http://url1.example.com http://url2.example.com
数据会通过POST传送给每个URL
</pre>
一个命令行使用多个URL,每个URL使用不同的请求方法
<pre>curl -l http://example.com --next http://example.com</pre>
<pre>curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html</pre>
--next类似一个分隔符,分割每个url和数据,分割的每一块相当于一个新的curl命令。
HTML表单
GET
<form method="GET" action="junk.cgi">
<input type=text name="birthday">
<input type=submit name=press value="ok">
</form>
<pre>curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=ok;"
表单所在页面的URL是www.hotmail.com/when/birth.html
</pre>
POST
<form method="POST" action="junk.cgi">
<input type=text name="birthyear">
<input type=submit name=press value=" ok ">
</form>
<pre>curl --data "birthyear=1905&press=%20OK%20" http://www.example.com/when.cgi</pre>
Content-Type=application/x-www-form-urlencoded]curl默认不会将数据编码,如果数据中包含空格,必须手动编码为%20,最新版的curl可以通过下面的参数将数据编码:
<pre>curl --data-urlencoded "name=I am Daniel" http://www.example.com</pre>
如果多次使用--data参数,curl会使用&将每个--data后面的数据合并起来。
POST文件上传
<from method="POST" enctype='multipart/from-data' action="upload.cgi">
<input type=file name=upload>
<input type=submit name=press value="OK">
</form>
<pre>curl --form upload=@localfilename --form press=OK [url]
注意这个Content-Type是multipart/form-data。
</pre>
隐藏字段
<form method="POST" action="foobar.cgi">
<input type=text name="birthyear">
<input type=hidden name="person" value="daniel">
<input type=submit name="press" value="OK">
</form>
<pre>curl --data "birthyear=1905&press=OK&person=daniel" [url]
对于curl来说隐藏的字段和显示的字段都是一样的。</pre>
HTTP认证
基础认证
<pre>curl --user name:password http://www.example.com
简单的混淆,截取后还是完全可读的。
</pre>
其它认证
根据响应头首部服务器可能会要求其它的认证方法,选择使用参数--ntlm、--digest、--negotiate、--anyauth。
代理认证
<pre>curl --proxy-user proxyuser:proxypassword curl.haxx.se
如果代理要求NTLM方法认证,使用--proxy-ntlm,如果是Digest方法认证,使用参数--proxy-digest。
</pre>
注意
值得注意的是当一个程序运行的时候,它的参数可能通过列出系统运行的进程看到。因此,假如你把用户认证信息作为命令行的参数传入,其他用户是可以看到这些参数值的。
更多HTTP头
Referer
<pre>curl --referer [referer url] [url]
curl --referer http://www.example.come http://www.example.com
从上面也可以很容易地看出referer其实是很容易伪造的。
</pre>
User Agent
让curl的请求看起来像是从Windows 2000上的IE5发出的:
<pre>curl --user-agent "Mozilla/4.0(compatible;MSIE 5.01;Windows NT 5.0)" [URL]</pre>
下面使得curl的请求看起来像是从一台老旧的Linux上Netscape4.73发出的:
<pre>curl --user-agent "Mozilla/4.73[en](X11;U;Linux2.2.15 i686)" [URL]</pre>
重定向
Location
<pre>curl --location http://www.example.com</pre>
其它重定向
浏览器一般还支持两种重定向的方法而curl不支持:一种是HTML可能会包含meta refresh标签可以让浏览器在指定时间后加载指定URL,另一种是用javascript这样做。
Cookies
Cookie参数
一个带cookie的请求:
<pre>curl --cookie "name=Daniel" http://www.example.com</pre>
通过保存响应头信息来保存cookies,可以使用--dump-header(或者-D)响应头信息:
<pre>curl --dump-header headers_and_cookies.txt http://www.example.com</pre>
使用之前保存的cookies的curl命令:
<pre>curl --cookie stored_cookies.txt http://www.example.com</pre>
贴出原文,没明白干啥:
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:
<pre>curl --cookie nada --location http://www.example.com</pre>
curl可以读写Netscape和Mozilla曾经用过的文件格式的cookie文件。--cookie(-b)可以自动识别给定的文件是否是这种文件格式并解析它,同时使用--cookie-jar(或-c)参数可以在一个请求操作之后将cookie写入一个文件。
<pre>curl --cookie cookie.txt --cookie-jar newcookie.txt http://www.example.com</pre>
HTTPS
HTTP是安全的HTTP
HTTP是建立在SSL(或者这个标准的最新版本TLS)上的HTTP,SSL会把通过网络发送和接受的数据加密,使得攻击者很难窥探敏感信息。使用curl从HTTPS服务器获得页面:
<pre>curl https://secure.example.com</pre>
认证证书
在HTTPS的世界里,除了一般的密码外使用证书证明你是谁。curl支持客户端证书。所有的证书被一个口令保护,这样在curl使用证书之前你必须通过这个口令。口令可以通过命令行声明,当curl需要使用这个证书的时候会自动进入口令验证。在HTTPS服务器上使用带证书的curl:
<pre>curl --cert mycert.pem https://secure.example.com</pre>
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:
<pre>curl --cacert ca-bundle.pem https://example.com</pre>
自定义请求元素
改变请求方法和请求头
通过--header参数可以自定义请求头,通过--request可以改变请求方法,下面的例子好好领会一下:
<pre>curl --data "<xml>" --header "Content-Type: text/xml" --request PROPFIND url.com</pre>
上面的例子将POST请求方法变成PROPFIND,发送的描述实体主体的首部由默认的Content-Type变为”Content-Type“。
可以通过提供忽略头部值的头部来删除对应首部:
<pre>curl --header "Host:" http://www.example.com</pre>
通过提供新的头部值来自定义头部,或者提供带属性值的新的头部来增加头部:
<pre>curl --header "Destination: http://anywhere.com" http://example.com</pre>
更多的关于改变请求方法
值得一提的是curl会根据请求的action来选择使用哪个请求方法,例如-d时curl会选择POST方法,-l时curl会选择HEAD方法,以此类推。假如你使用--request/-X会改变curl选择的方法关键字,但是并不会改变curl的行为。这也意味着,当你用-d"data""去作一个POST请求,你可以通过-X将方法改变为PROPFIND,但是curl还是认为它发出的是一个POST请求。可以改变默认GET方法为POST通过如下命令:
<pre>curl -X POST http://example.org</pre>
参考
RFC 7230 如果想要深入理解HTTP协议这是必读的文档
RFC 3986 解释URL语法
RFC 1867 定义HTTP基于HTML表单的文件上传
RFC 6525 定义HTTP cookies是如何工作的