跳转至

Curl

时间 : 2017-04-20 16:14:22

参考:

  1. curl 的用法指南
  2. cookbooks-curl

curl 命令介绍#

用于和网络服务器进行通信、数据下载等。

curl 语法#

curl [options] [URL...]

选项

  • -v: 输出通信的整个过程。
  • -o, --output <file>: 把获取到的数据都写入到文件中。
  • -O, --remote-name: 使用服务器上的文件名字保存本地文件。
  • -s, --silent: 安静模式,不显示进度条或错误信息。
  • -S, --show-error: 当使用 -s 模式的时候,使用 -S 可以显示错误信息。
  • --limit-rate <speed> : 限制下载速度,速度单位(B,K,M,G)。
  • -L: 如果网页的Header里面指定重定向地址,请求会重定向到指定的地址。
  • -c,--cookie-jar <file name>:把操作完成之后的 cookie 写入到指定文件。如果文件名是 - cookie 将写入到控制台。
  • -C,--continue-at <offset>: 断点续传, -C - 自动查找中断点。
  • -z,--time-cond <date expression>|<file>:获取一个文件,这个文件的变更时间在给定时间之后或之前,默认之后,如果没有匹配日期表达式,则会以表达式为名字获取对应文件的修改日期。时间表达式以 - 开头,获取变更时间在给定时间前的文件。
  • -y,--speed-time <time>:如果下载速度小于 speed-limit 的时间超过指定时间,则停止下载。如果 speed-limit 没有设置则为1。
  • -Y,--speed-limit <speed>: 如果下载速度小于指定速度(bytes per second),并且下载时间超过 speed-time 指定的时间,则终止下载。如果 speed-time 没有设置则为30。
  • -u,--user <username:password;options>:指定用户明和密码登录,如果密码没有指定,后面会询问。
  • -x,--proxy <[protocol://][user:password@]proxyhost[:port]>:代理访问。
  • -d,--data : Post请求发送指定的数据到服务器。使用 '-d name=daniel -d skill=lousy' 将发送 name=daniel&skill=lousy。如果data以字母@开头,将会从对应的文件中读取。
  • -D,--dump-header <file> :把协议头信息写入指定文件。
  • -b,--cookie <name=data>:吧数据当成cookie发送给服务器,如果没有 = 号,则会从文件中读取。
  • -A,--user-agent <agent string>: 用户代理,什么类型的浏览器。
  • -I, --head : 只获取HTTP响应头

curl 具体使用#

  • 请求指定网址,请求内容显示在命令行。

    curl http://www.baidu.com
    
  • GET 请求

    curl -X GET http://www.baidu.com
    
  • GET 请求,加参数

    curl -G -d 'name=name' -d 'age=age' http://www.baidu.com
    
  • POST 请求, -d 指定参数。Content-Type: application/x-www-form-urlencoded

    curl -X POST -d 'name=name&age=age'  http://www.baidu.com
    curl -v -X POST -d 'name=name&age=age'  http://www.baidu.com
    
  • POST 请求, --data-urlencode URL Encode 参数。Content-Type: application/x-www-form-urlencoded

    curl -X POST --data-urlencode 'name=name&age=age' http://www.baidu.com
    curl -v -X POST --data-urlencode 'name=name&age=age' http://www.baidu.com
    
  • POST 请求,form-data, -F 指定参数。Content-Type: multipart/form-data

    curl -X POST -F 'name=123' -F 'age=44' http://www.baidu.com
    curl -v -X POST -F 'name=123' -F 'age=44' http://www.baidu.com
    
  • POST 请求, 发送JSON参数。Content-Type: application/json

    curl -X POST -H 'Content-Type: application/json' -d '{"username":"test","password":"password"}' http://www.baidu.com
    curl -v -X POST -H 'Content-Type: application/json' -d '{"username":"test","password":"password"}' http://www.baidu.com
    
  • POST 请求,上传文件。Content-Type: multipart/form-data

    curl -X POST -F 'image=@/mnt/data/install_docker.sh' http://www.baidu.com/
    curl -v -X POST -F 'image=@/mnt/data/install_docker.sh' http://www.baidu.com/
    
  • Header 请求

    curl -I http://www.baidu.com
    
  • 指定代代理头

    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' https://www.baidu.com
    
  • 发送Cookie

    curl -b 'name=value;name=value' https://www.baidu.com
    
  • 设置 Referer

    curl -e 'https://www.baidu1.com' https://www.baidu.com
    
  • 添加HEADER

    curl -H 'TOKEN: xxxxxx' -H 'XX: xx'  https://www.baidu.com
    
  • 显示响应的HTTP头

    curl -i http://www.baidu.com
    
  • 跳过ssl检测

    curl -k https://www.baidu.com
    
  • 支持重定向

    curl -L http://www.baidu.com
    
  • 限制带宽

    curl --limit-rate 1b http://www.baidu.com
    
  • 把网址内容保存到指定文件中。

    curl -o baidu.html http://www.baidu.com
    # 简单正则
    curl -o "#1.html" http://www.cnblogs.com/gbyukg/p/332682[0-9].html
    curl -o "#1_#2.html" http://www.{cnblogs}.com/gbyukg/p/332682[0-9].html
    
  • 使用服务器上的文件名自动保存在本地,(如果文件在服务器不是以文件存在,则会出错)。

    curl -O https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png
    # 错误
    curl -O http://www.baidu.com
    
  • 从ftp服务器下载文件

    # 列出目录下的所有文件夹
    curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
    # 下载文件
    curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
    
  • 上传文件

    # 将myfile.txt文件上传到服务器
    curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com
    # 同时上传多个文件
    curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com
    # 从标准输入获取内容保存到服务器指定的文件中
    curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
    
  • 查询单词意思或翻译

    curl dict://dict.org/d:bash
    # 列出所有可用词典
    curl dict://dict.org/show:db
    # 在fd-deu-fra词典中查询bash单词的含义
    curl dict://dict.org/d:bash:fd-deu-fra
    
  • 统计HTTP请求各阶段接口耗时

    curl -w "\n\n\n\n\n响应:\n        url_effective:  %{url_effective}
              error_msg:  %{errormsg}
              exit_code:  %{exitcode}
            content_type:  %{content_type}
               http_code:  %{http_code}
            http_connect:  %{http_connect}
            http_version:  %{http_version}
                local_ip:  %{local_ip}
               remote_ip:  %{remote_ip}
             remote_port:  %{remote_port}
           response_code:  %{response_code}
            size_request:  %{size_request} \tbyte
           size_download:  %{size_download} \tbyte
             size_header:  %{size_header} \tbyte
             size_upload:  %{size_upload} \tbyte
          speed_download:  %{speed_download} \tbyte/s
            speed_upload:  %{speed_upload} \tbyte/s
         time_namelookup:  %{time_namelookup} s (DNS 域解析耗时)
            time_connect:  %{time_connect} s (TCP 三次握手耗时)
         time_appconnect:  %{time_appconnect} s (SSL/SSH 等上层协议建立连接)
           time_redirect:  %{time_redirect} s (重定向步骤耗时)
        time_pretransfer:  %{time_pretransfer} s (从请求开始到向服务器发送第一个 GET/POST 请求开始之前的耗时)
      time_starttransfer:  %{time_starttransfer} s (从请求开始到第一个字节将要传输的时>    间)
                         ----------
              time_total:  %{time_total} s (从请求开始到完成的总耗时)
     ------------------------------------------------------------------
     备注:
     DNS 解析查询时间:time_namelookup
     TCP 建立连接时间:time_connect - time-namelookup
       服务器处理时间:time_starttransfer - time_pretransfer
         内容传输时间:time_total - time_starttransfer\n" -S -s -L -k -o /dev/null https://www.baidu.com
    

    等价命令,可以把输出内容写到文件中:

curl -w "@format.txt" -S -s -L -k -o /dev/null https://www.baidu.com
1
文件内容:`format.txt`
      url_effective:  %{url_effective}\n
          error_msg:  %{errormsg}\n
          exit_code:  %{exitcode}\n
       content_type:  %{content_type}\n
          http_code:  %{http_code}\n
       http_connect:  %{http_connect}\n
       http_version:  %{http_version}\n
           local_ip:  %{local_ip}\n
          remote_ip:  %{remote_ip}\n
        remote_port:  %{remote_port}\n
      response_code:  %{response_code}\n
       size_request:  %{size_request} \tbyte\n
      size_download:  %{size_download} \tbyte\n
        size_header:  %{size_header} \tbyte\n
        size_upload:  %{size_upload} \tbyte\n
     speed_download:  %{speed_download} \tbyte/s\n
       speed_upload:  %{speed_upload} \tbyte/s\n
    time_namelookup:  %{time_namelookup} s (DNS 域解析耗时)\n
       time_connect:  %{time_connect} s (TCP 三次握手耗时)\n
    time_appconnect:  %{time_appconnect} s (SSL/SSH 等上层协议建立连接)\n
      time_redirect:  %{time_redirect} s (重定向步骤耗时)\n
   time_pretransfer:  %{time_pretransfer} s (从请求开始到向服务器发送第一个 GET/POST 请求开始之前的耗时
)\n
 time_starttransfer:  %{time_starttransfer} s (从请求开始到第一个字节将要传输的时间)\n
                    ----------\n
         time_total:  %{time_total} s (从请求开始到完成的总耗时)\n
------------------------------------------------------------------\n
备注:\n
DNS 解析查询时间:time_namelookup\n
TCP 建立连接时间:time_connect - time-namelookup\n
  服务器处理时间:time_starttransfer - time_pretransfer\n
    内容传输时间:time_total - time_starttransfer\n