美文网首页闲杂
cURL有关HTTP的命令

cURL有关HTTP的命令

作者: 木月摇江 | 来源:发表于2016-06-24 14:55 被阅读787次

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

    保存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>

    使用之前保存的cookiescurl命令:

    <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是如何工作的

    相关文章

      网友评论

        本文标题:cURL有关HTTP的命令

        本文链接:https://www.haomeiwen.com/subject/mxbodttx.html