首页 curl使用指南
文章
取消

curl使用指南

简介

本文是curl初级和高级功能的说明,如果有些参数在执行过程中不支持,请curl -v检查版本,本文档全部参数都要成功需要版本为7.87。curl文档链接:https://curl.se/docs/manpage.html

基本功能

get请求

1
curl https://www.liuquanhao.com/

带”&”参数的请求,因为”&”是linux shell的后台运行参数,需要用双引号引入标记为字符串

1
curl "https://www.liuquanhao.com/?a=1&b=2"

获取请求详细信息

1
curl -v https://www.liuquanhao.com/

只获取header

1
curl -I https://www.liuquanhao.com/

请求携带header

1
curl -H "Content-type:application/json" -H "Accept-Content:application/json" https://www.liuquanhao.com/

带上referer请求,防盗链会使用此参数

1
curl --referer "https://www.liuquanhao.com/" https://www.liuquanhao.com/1.png

跟随301/302/303跳转

1
curl -L https://www.liuquanhao.com/

301/302/303跳转后为post请求,默认跳转后为get请求

1
2
3
curl --post301 -L -d "data" https://www.liuquanhao.com/
curl --post302 -L -d "data" https://www.liuquanhao.com/
curl --post303 -L -d "data" https://www.liuquanhao.com/

使用代理请求

1
2
curl -x http://proxy.cn/ https://www.liuquanhao.com/
curl --socks5 127.0.0.1:1080 https://www.liuquanhao.com/

使用fastopen和nodelay请求

1
curl --tcp-fastopen --tcp-nodelay http://proxy.cn/ https://www.liuquanhao.com/

按原文件名下载文件

1
curl -O https://www.liuquanhao.com/assets/1.png

使用”#”作为进度条下载文件

1
curl -# -O https://www.liuquanhao.com/assets/1.png

使用安静模式下载

1
curl -s https://www.liuquanhao.com/ -o download.txt

自定义名称下载文件

1
curl https://www.liuquanhao.com/ -o download.txt

批量下载

1
curl "https://www.liuquanhao.com/{1, 2}.zip" -o "file_#1.zip"

批量下载

1
curl "https://{zip1, zip2}.liuquanhao.com/[1-10].zip" -o "#1_#2.zip"

并行下载文件

1
curl -Z "https://{zip1, zip2}.liuquanhao.com/[1-10].zip" -o "#1_#2.zip"

下载文件的部分字节

1
2
3
4
5
6
curl -r 0-99 https://liuquanhao.com/
curl -C - https://liuquanhao.com/
curl -C 100 https://liuquanhao.com/

curl -r 100-199 https://liuquanhao.com/
curl -r -200 https://liuquanhao.com/

限制每秒2个请求

1
curl --rate 2/s https://www.liuquanhao.com/ -o download.txt

限制下载速率为100KB/s

1
curl --limit-rate 100K https://www.liuquanhao.com/ -o download.txt

post请求

1
curl -X POST https://www.liuquanhao.com/

post带参数

1
curl -X POST -d "hello=world" https://www.liuquanhao.com/

post带文件

1
curl -X POST -d "@test.txt" https://www.liuquanhao.com/

put请求

1
curl -X PUT -d "hello=world" https://www.liuquanhao.com/

不做ssl证书验证

1
curl get -k https://www.liuquanhao.com/

发送json请求

1
curl -X POST -d '{"hello": "world"}' --header "Content-Type: application/json" --header "Accept: application/json" https://www.liuquanhao.com/

发送json请求

1
curl --json '{ "hello": "world" }' https://www.liuquanhao.com/

高级功能

获取返回状态码

需要使用”-s -o /dev/null”避免页面数据显示影响结果

1
curl -s -o /dev/null -w '%{http_code}\n' https://www.liuquanhao.com/

获取请求各项状态数据

1
2
3
4
5
6
7
8
9
10
11
12
cat << EOF > curl-detail.txt
     time_namelookup:  %{time_namelookup}s\n
        time_connect:  %{time_connect}s\n
     time_appconnect:  %{time_appconnect}s\n
    time_pretransfer:  %{time_pretransfer}s\n
       time_redirect:  %{time_redirect}s\n
  time_starttransfer:  %{time_starttransfer}s\n
                     ----------\n
          time_total:  %{time_total}s\n
EOF

curl -w "@curl-detail.txt" -o /dev/null -s "https://www.liuquanhao.com/"

其他状态参数说明

  • content_type: header中的Content-Type
  • errormsg: 错误信息
  • exitcode: 退出码
  • filename_effective: 最终写入本地的文件名,需要配合-o参数才有意义
  • ftp_entry_path: 登录ftp时最终的路径
  • header_json: 返回参数的所有header组成的json
  • http_code: http返回码
  • http_connect: 通过代理地址时,获取链路最后一个请求的返回码
  • http_version: http版本
  • local_ip: 本地ip
  • local_port: 本地端口
  • method: 请求方法
  • num_connects: 请求连接数
  • num_headers: header数量,跳转重新计算
  • num_redirects: 跳转次数
  • proxy_ssl_verify_result: 代理ssl验证结果
  • redirect_url: 实际跳转链接
  • referer: referer参数
  • remote_ip: 远程ip
  • remote_port: 远程端口
  • response_code: 返回码,原来为http_code
  • scheme: 请求协议
  • size_download: 下载字节数
  • size_header: header字节数
  • size_request: 请求字节数
  • size_upload: 上传文件字节数,包括文件和请求参数,不包括header
  • speed_download: 下载速率
  • speed_upload: 上传速率
  • ssl_verify_result: ssl验证结果
  • stderr: 如果加入此变量,返回将写入stderr
  • stdout: 默认,返回写入到stdout
  • time_appconnect: 开始到ssl完成的秒数
  • time_connect: 开始到tcp连接完成的秒数
  • time_namelookup: 开始到dns解析完成的秒数
  • time_pretransfer: 传输前的所有准备花费的秒数,例如有101协议切换,能统计到此时间
  • time_redirect: 所有重定向的秒数
  • time_starttransfer: 开始到到接收到地一个字节的秒数,包括ime_pretransfer和服务器处理时间
  • time_total: 整个请求花费的秒数
  • url: 请求的url
  • urlnum: 请求的url数量
  • url_effective: 最终请求的url,如果用重定向跳转,将是跳转最后请求的url

关于请求时间的解释

本地应用(如chrome)请求时间花费: 本地程序初始化/请求排队延迟时间 + dns解析时间(可缓存)+ tcp握手时间 + ssl握手时间(如果是https请求) + 服务器处理业务时间 + 返回数据时间

  • time_namelookup = 本地程序初始化时间 + dns解析时间
  • time_connect = time_namelookup + tcp握手时间
  • time_appconnect = time_connect + ssl握手时间
  • time_pretransfer = time_connect(或time_appconnect,https时)+ 其他处理时间(开始请求之前的花费,如time_redirect时间)
  • time_starttransfer = time_pretransfer + 服务器处理时间 + 第一个字节从服务器发送到客户端的时间
  • time_total = time_starttransfer + 返回数据花费的时间
知识共享许可协议 本文由作者按照 CC BY-SA 4.0 进行授权