curl命令详解

TOC

curl命令简介

curl是一个非常强大的工具,它不仅可以下载网上文件,更重要的是它是用来与服务器之间传输数据的,其支持的协议包括 DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET,TFT这些协议
curl还提供了支持代理访问、用户认证、ftp上传下载、http请求等功能

curl命令和选项

语法:curl【选项】【url地址】
选项和参数:

  • -o, --output:将信息输出到文件
  • -O, --remote-name:按照服务器上的文件名,存在本地
  • -L:自动跟随重定向(HTTP 3xx)。
  • -X:指定请求方式POST还是GET,默认GET
  • -x, --proxy:指定代理服务器地址和端口
  • -v:显示一次http通信的整个过程,包括端口连接和http request头信息。
  • -H:指定请求头信息
  • -s, --slient:减少输出信息
  • -u, --user[user:pass]:设置http认证用户和密码
  • –l, --head:仅返回头部信息
  • -c, --cookie-jar:将cookie写入到文件
  • -b, --cookie:从文件中读取cookie
  • -C, --continue-at:断点续传
  • -d, --data:http post方式传送数据
  • -D, --dump-header:把header信息写入到文件
  • -F, --from:模拟http表达提交数据
  • -T, --upload-file:上传文件
  • -e, --referer:指定引用地址
  • -w, --write-out:输出指定格式内容
  • -m:设置整个请求的最大执行时间
  • –retry:重试次数
  • –connect-timeout:指定尝试连接的最大时间/s

常用操作

访问页面

常规获取网页内容。
命令格式:

curl <URL地址>

【示例】

curl https://www.baidu.com

1.用户认证

访问http认证页面使用-u选项输入用户名:密码
命令格式:

curl -u <用户名:密码> <URL地址>

【示例】

curl –u username:password http://www.example.com

2.查看请求头

使用-I选项查看请求头信息
命令格式:

curl -I <URL地址>

【示例】

curl -I https://www.baidu.com

3.显示详细调试信息

使用-v选项可以显示详细的调试请求信息,包括请求和响应信息。
命令格式:

curl -v <URL地址>

【示例】

curl -v https://www.baidu.com

文件下载

1.普通下载

使用-O或者-o选项重定向输出来下载文件。
按照网络上的文件原名字下载到本地。
命令格式:

curl -O <URL地址>(精确到文件名)

【示例】

curl -O https://www.example.com/release/pakge.tgz

下载文件下来并重命名该文件,也可用于指定下载位置。
命令格式:

curl -o <新文件名> <URL地址>(精确到文件名)

【示例】

curl -o package.tar.gz https://www.example.com/release/pakge.tgz

同一页面有多个文件需要下载可以用以下方法循环下载。
命令格式:

curl -O <URL地址>/前缀重复名[循环范围].文件后缀

【示例】

curl -O  https://www.example.com/abc[1-5].jpeg

使用-s选项下载不显示进度条
命令格式:

curl -s -O <URL地址>

【示例】

# 不显示进度条
curl -s -O http://www.linux.com/dodo1.JPG

2.分块下载

如果文件的size比较大的话可以通过-r选项来进行分块下载,-r后面跟范围,单位是字节。
命令格式:

curl -r <大小范围> -o 阶段文件名 <URL地址>(精确到文件名)

【示例】将文件分为三份大小进行下载

curl -r 0-100 -o file_part1 https://www.example.com/release/dhusdg234.jpeg
curl -r 100-200 -o file_part2 https://www.example.com/release/dhusdg234.jpeg
curl -r 200- -o file_part3 https://www.example.com/release/dhusdg234.jpeg
# 通过cat来合并块文件组成dhusdg234.jpeg文件
cat file_part* > dhusdg234.jpeg

3.ftp下载

curl可以通过ftp下载文件,
命令格式:

curl -O -u <用户名:密码> ftp://<ftp地址>/<文件路径>
# 或者第二种方式
curl -O ftp://<用户名:密码>@<ftp地址>/<文件路径>

【示例】命令分为两种格式,如下所示:

curl -O -u username:password ftp://192.168.100.101/photos/15754325.png
curl -O ftp://username:password@192.168.100.101/photos/15754325.png

4.断点续传

只需要使用-C选项就可以使用断点续传,从文件头的指定位置开始继续下载/上传,offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输。
命令格式:

curl -C -O <URL地址>(精确到文件名)

【示例】

curl -C -O http://www.example.com/release/pakge.tgz

高级应用

设置来源页面(referer)

可以使用-e选项来伪造来源页面
命令格式:

curl -e <伪造地址> <URL地址>

【示例】比如:告诉www.example.com我是www.aaa.com

curl -e http://www.aaa.com http://www.example.com

模仿浏览器

curl内置-A选项可以让我们设置User-Agent请求头。
命令格式:

curl -A <请求头值> <URL地址>

【示例】

curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36" http://www.example.com

设置代理

通过-x或者--proxy选项来设置代理。
命令格式:

curl -x <代理地址> <URL地址>

【示例】

curl -x http://127.0.0.1:1080 http://www.google.com

忽略HTTPS证书验证

通过-k或者--insecure选项可以忽略HTTPS证书校验。
命令格式:

curl -k <URL地址>

【示例】

curl -k https://www.example.com

使用客户端证书认证

通过--cert <证书文件>选项使用客户端证书,--key <证书密钥文件>选项使用客户端密钥进行认证
命令格式:

curl <选项> <URL地址> --cert <客户端证书文件> --key <客户端证书密钥文件>

【示例】

curl -k -vo /dev/null https://www.example.com/ --cert ./certs/client.crt --key ./certs/client.key

修改模拟DNS解析

可以使用--resolve <解析域名:端口:IP地址>参数来模拟实现域名解析修改测试访问域名。
命令格式:

curl <选项> <URL地址> --resolve <解析域名>:<端口>:<解析ip地址>

【示例】

curl https://www.example.com/ --resolve www.example.com:443:127.0.0.1

修改返回信息输出格式

可以通过-w选项来按照自己想要的输出格式返回信息。
命令格式:

curl -w "<修改的输出格式内容>" <URL地址>

【示例】

curl -o /dev/null -I -s -w "网页状态码: %{http_code}" https://www.baidu.com
网页状态码: 200 # 返回结果

网络与连接参数

限速下载

使用--limit-rate=<速度>选项可以限制网络下载速度,支持单位k/m。
命令格式:

curl <选项> --limit-rate=<限制速度,单位k/m> <URL地址>

【示例】

curl -O --limit-rate=200k https://www.example.com/file.zip

重试次数

使用--retry <次数>选项设置重试次数,超过次数则不重试报错失败,默认为20
命令格式:

curl --retry <次数> <URL地址>

【示例】

curl --retry 5 https://www.example.com

也可以使用--retry-delay <时间:秒>选项来设置重试之间间隔时间。
命令格式:

curl --retry <次数> --retry-delay <时间:秒> <URL地址>

【示例】

curl --retry 5 --retry-delay 3 https://www.example.com

还可以使用--retry-max-time <时间:秒>选项来限制重试的总时间,超过这个时间就算还有次数也不再重试。
命令格式:

curl --retry <次数> --retry-max-time <时间:秒> <URL地址>

【示例】

curl --retry 10 --retry-max-time 60 https://www.example.com

超时时间

使用--connect-timeout <时间:秒>选项设置建立连接的超时时间(即 TCP 三次握手时间)。
命令格式:

curl --connect-timeout <时间:秒> <URL地址>

【示例】

curl --connect-timeout 10 https://example.com

还可以使用-m <时间:秒>或者--max-time <时间:秒>选项设置整个请求的最大执行时间(连接 + 传输),超过时间会直接退出。
命令格式:

curl -m <时间:秒> <URL地址>

【示例】

curl -m 30 https://www.example.com

curl实现请求操作

常见请求

发送请求方法可以通过-X <请求方法>选项来指定请求方法。

GET请求

发送GET请求。
命令格式:

curl <URL地址>
# 或者另外方式
curl -X GET <URL地址>

【示例】

curl http://www.example.com/api
curl -X GET http://www.example.com/api

POST请求

发送POST请求。
命令格式:

curl -X POST -d <请求数据参数> <URL地址>

【示例】

curl -X POST -d 'name=admin&data=dshudsh' http://www.example.com/api

发送json格式请求。
命令格式:

# 传递json请求体数据
curl -H "Content-Type: application/json" -X POST -d <请求体数据> <URL地址>
# 指定文件
curl -H "Content-Type: application/json" -X POST -d @<文件位置>(精确到文件名) <URL地址>

【示例】

# 传递json请求体
curl -H "Content-Type: application/json" \
     -X POST -d '{"a":123,"b":"wjidhg2"}' \
     http://www.example.com/api
# 指定json文件
curl -H "Content-Type: application/json" \
     -X POST -d @data.json \
     http://www.example.com/api

补充说明:-X设置请求方法,-H或者--为设置请求头(可重复指定多个),-d则是传递数据(可重复指定多个),通常使用这几个参数使用curl发起请求。

设置cookie

可以通过-b来设置传递cookie信息。
命令格式:

curl -b <cookie数据> <URL地址>

【示例】

curl -b "session_id=wqmkfwi38dvst229dmkjd" http://www.example.com/api

保存http请求response的cookie信息。
命令格式:

curl -c <记录cooike数据文件> <URL地址>

【示例】

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

使用保存的cookie信息。
命令格式:

curl -b <记录cooike数据文件> <URL地址>

【示例】

curl -b cookiec.txt http://www.example.com