前言
本篇文章包含了curl的常用案例使用。
如果想了解curl选项的详细说明,请参考前一篇文章「Linux curl 命令详解」。
常见网页访问示例
基本用法
访问一个网页
1 | curl https://www.baidu.com |
执行后,相关的网页信息会打印出来
进度条展示
有时候我们不需要进度表展示,而需要进度条展示。比如:下载文件时。
可以通过 -#, --progress-bar 选项实现。
1 | [root@iZ28xbsfvc4Z 20190713]# curl https://www.baidu.com | head -n1 # 进度表显示 |
静默模式与错误信息打印
当我们做一些操作时,可能会出现进度表。这时我们可以使用 -s, --silent 静默模式去掉这些不必要的信息。
如果使用 -s, --silent 时,还需要打印错误信息,那么还需要使用 -S, --show-error 选项。
静默模式示例
1 | [root@iZ28xbsfvc4Z ~]# curl https://www.baidu.com | head -n1 |
静默模式结合错误信息打印
1 | [root@iZ28xbsfvc4Z 20190713]# curl -s https://140.205.16.113/ |
显示详细操作信息
使用 -v, --verbose 选项实现。
以 > 开头的行表示curl发送的”header data”;< 表示curl接收到的通常情况下隐藏的”header data”;而以 * 开头的行表示curl提供的附加信息。
1 | [root@iZ28xbsfvc4Z 20190712]# curl -v https://www.baidu.com |
指定访问的请求方法
当然curl默认使用GET方式访问。使用了 -d, --data <data> 选项,那么会默认为 POST方法访问。如果此时还想实现 GET 访问,那么可以使用 -G, --get 选项强制curl 使用GET方法访问。
同时 -X, --request <command> 选项也可以指定访问方法。
POST请求和数据传输
为了抓包查看信息所以使用了 --local-port <num>[-num] 选项,在实际应用中不需要该选项。
1 | [root@iZ28xbsfvc4Z ~]# curl -sv --local-port 9000 -X POST -d 'user=zhang&pwd=123456' http://www.zhangblog.com/2019/06/24/domainexpire/ | head -n1 |
抓包信息
1 | [root@iZ28xbsfvc4Z tcpdump]# tcpdump -i any port 9000 -A -s 0 |
指定请求方法
1 | curl -vs -X POST https://www.baidu.com | head -n1 |
1 | curl -vs -X PUT https://www.baidu.com | head -n1 |
保存访问网页
使用linux的重定向功能保存
1 | curl www.baidu.com >> baidu.html |
使用curl的大O选项
通过 -O, --remote-name 选项实现。
1 | [root@iZ28xbsfvc4Z 20190712]# curl -O https://www.baidu.com # 使用了 -O 选项,必须指定到具体的文件 错误使用 |
使用curl的小o选项
通过 -o, --output <file> 选项实现。
1 | [root@iZ28xbsfvc4Z 20190713]# curl -o sina.txt https://www.sina.com.cn/ # 单个操作 |
允许不安全访问
当我们使用curl进行https访问访问时,如果SSL证书是我们自签发的证书,那么这个时候需要使用 -k, --insecure 选项,允许不安全的访问。
1 | [root@iZ28xbsfvc4Z ~]# curl https://140.205.16.113/ # 被拒绝 |
获取HTTP响应状态码
在脚本中,这是很常见的测试网站是否正常的用法。
通过 -w, --write-out <format> 选项实现。
1 | [root@iZ28xbsfvc4Z 20190713]# curl -o /dev/null -s -w %{http_code} https://baidu.com |
指定proxy服务器以及其端口
很多时候上网需要用到代理服务器(比如是使用代理服务器上网或者因为使用curl别人网站而被别人屏蔽IP地址的时候),幸运的是curl通过使用 -x, --proxy <[protocol://][user:password@]proxyhost[:port]> 选项来支持设置代理。
1 | curl -x 192.168.100.100:1080 https://www.baidu.com |
模仿浏览器访问
有些网站需要使用特定的浏览器去访问他们,有些还需要使用某些特定的浏览器版本。我们可以通过 -A, --user-agent <agent string> 或者 -H, --header <header> 选项实现模拟浏览器访问。
1 | curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/75.0.3770.999" http://www.zhangblog.com/2019/06/24/domainexpire/ |
伪造referer(盗链)
有些网站的网页对http访问的链接来源做了访问限制,这些限制几乎都是通过referer来实现的。
比如:要求是先访问首页,然后再访问首页中的邮箱页面,这时访问邮箱的referer地址就是访问首页成功后的页面地址。如果服务器发现对邮箱页面访问的referer地址不是首页的地址,就断定那是个盗连了。
可以通过 -e, --referer 或则 -H, --header <header> 实现伪造 referer 。
1 | curl -e 'https://www.baidu.com' http://www.zhangblog.com/2019/06/24/domainexpire/ |
构造HTTP请求头
可以通过 -H, --header <header> 实现构造http请求头。
1 | curl -H 'Connection: keep-alive' -H 'Referer: https://sina.com.cn' -H 'User-Agent: Mozilla/1.0' http://www.zhangblog.com/2019/06/24/domainexpire/ |
保存响应头信息
可以通过 -D, --dump-header <file> 选项实现。
1 | [root@iZ28xbsfvc4Z 20190703]# curl -D baidu_header.info www.baidu.com |
限时访问
--connect-timeout <seconds> 连接服务端的超时时间。这只限制了连接阶段,一旦curl连接了此选项就不再使用了。
1 | # 当前 https://www.zhangXX.com 是国外服务器,访问受限 |
-m, --max-time <seconds> 允许整个操作花费的最大时间(以秒为单位)。这对于防止由于网络或链接变慢而导致批处理作业挂起数小时非常有用。
1 | [root@iZ28xbsfvc4Z ~]# curl -m 10 --limit-rate 5 http://www.baidu.com/ | head # 超过10秒后,断开连接 |
显示抓取错误
当我们请求访问失败时或者没有该网页时,网站一般都会给出一个错误的提示页面。
如果我们不需要这个错误页面,只想得到简洁的错误信息。那么可以通过 -f, --fail 选项实现。
1 | [root@iZ28xbsfvc4Z 20190713]# curl http://www.zhangblog.com/201912312 |
表单登录与cookie使用
参见:「Linux curl 表单登录或提交与cookie使用」
文件上传与下载
涉及 FTP 服务,简单快速搭建可参考:《CentOS7下安装FTP服务》「https://www.cnblogs.com/zhi-leaf/p/5983550.html」
文件下载
网页文件下载
1 | # 以进度条展示,而不是进度表展示 |
FTP文件下载
说明1:其中 ftp1 用户是ftp服务端的账号,具体家目录是:/mnt/ftp1
说明2:当我们使用 curl 通过 FTP 进行下载时,后面跟的路径都是:当前使用的 ftp 账号家目录为基础的相对路径,然后找到的目标文件。
示例1
1 | # 其中 tmp.data 的绝对路径是:/mnt/ftp1/tmpdata/tmp.data ;ftp1 账号的家目录是:/mnt/ftp1 |
示例2
1 | # 其中 nginx-1.14.2.tar.gz 的绝对路径是:/tmp/nginx-1.14.2.tar.gz ;ftp1 账号的家目录是:/mnt/ftp1 |
文件上传
FTP文件上传
可以通过 -T, --upload-file <file> 选项实现。
说明1:其中 ftp1 用户是ftp服务端的账号,具体家目录是:/mnt/ftp1
1 | # 其中 tmp_client.data 是客户端本地文件; |
断点续传
使用 -C, --continue-at <offset> 选项实现。其中使用 “-C -“「注意有空格和无空格的情况」,告诉curl自动找出在哪里/如何恢复传输。
网页端断点续传下载
1 | curl -C - -o tmp.data http://www.zhangblog.com/uploads/tmp/tmp.data # 下载一个 2G 的文件 |
FTP断点续传下载
细节就不多说了,可参见上面的「FTP文件下载」
1 | curl -C - -o tmp.data1 ftp://ftp1:123456@172.16.1.195:21/tmpdata/tmp.data # 下载一个 2G 的文件 |
分段下载
有时文件比较大,或者难以迅速传输,而利用分段传输,可以实现稳定、高效并且有保障的传输,更具有实用性,同时容易对差错文件进行更正。
可使用 -r, --range <range> 选项实现。
如下示例使用了同一张图片,大小为 18196 字节。
网页端分段下载
分段下载
1 | [root@iZ28xbsfvc4Z 20190715]# curl -I http://www.zhangblog.com/uploads/hexo/00.jpg # 查看文件大小 |
查看下载文件
1 | [root@iZ28xbsfvc4Z 20190715]# ll |
文件合并
1 | [root@iZ28xbsfvc4Z 20190715]# cat 00-jpg.part1 00-jpg.part2 00-jpg.part3 > 00.jpg |
FTP分段下载
分段下载
1 | [yun@nginx_proxy01 20190715]$ curl -r 0-499 -o 00-jpg.part1 ftp://ftp1:123456@172.16.1.195:21/tmpdata/00.jpg |
查看下载文件
1 | [yun@nginx_proxy01 20190715]$ ll 00-jpg.part* |
文件合并
1 | [yun@nginx_proxy01 20190715]$ cat 00-jpg.part1 00-jpg.part2 00-jpg.part3 > 00.jpg |