责编 | 屠敏
出品 | CSDN 博客
本篇文章包含了curl的常用案例利用。

常见网页访问示例
基本用法
访问一个网页:
curl https://www.baidu.com
实行后,干系的网页信息会打印出来。
进度条展示
有时候我们不须要进度表展示,而须要进度条展示。比如:下载文件时。
可以通过 -#, --progress-bar 选项实现。
[root@iZ28xbsfvc4Z 20190713]# curl https://www.baidu.com | head -n1 # 进度表显示% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 2443 100 2443 0 0 11662 0 --:--:-- --:--:-- --:--:-- 11688<!DOCTYPE html>[root@iZ28xbsfvc4Z 20190713]# curl -# https://www.baidu.com | head -n1 # 进度条显示######################################################################## 100.0%<!DOCTYPE html>
静默模式与缺点信息打印
当我们做一些操作时,可能会涌现进度表。这时我们可以利用 -s, --silent 静默模式去掉这些不必要的信息。
如果利用 -s, --silent 时,还须要打印缺点信息,那么还须要利用 -S, --show-error 选项。
静默模式示例
[root@iZ28xbsfvc4Z ~]# curl https://www.baidu.com | head -n1% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 2443 100 2443 0 0 11874 0 --:--:-- --:--:-- --:--:-- 11859<!DOCTYPE html>[root@iZ28xbsfvc4Z ~]# curl -s https://www.baidu.com | head -n1<!DOCTYPE html>
静默模式结合缺点信息打印
[root@iZ28xbsfvc4Z 20190713]# curl -s https://140.205.16.113/ [root@iZ28xbsfvc4Z 20190713]#[root@iZ28xbsfvc4Z 20190713]# curl -sS https://140.205.16.113/curl: (51) Unable to communicate securely with peer: requested domain name does not match the server's certificate.
显示详细操作信息
利用 -v, --verbose 选项实现。
以 > 开头的行表示curl发送的\"大众header data\"大众;< 表示curl吸收到的常日情形下隐蔽的\"大众header data\公众;而以 开头的行表示curl供应的附加信息。
[root@iZ28xbsfvc4Z 20190712]# curl -v https://www.baidu.com About to connect to www.baidu.com port 443 (#0) Trying 180.101.49.12... Connected to www.baidu.com (180.101.49.12) port 443 (#0) Initializing NSS with certpath: sql:/etc/pki/nssdb CAfile: /etc/pki/tls/certs/ca-bundle.crtCApath: none SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 Server certificate: subject: CN=baidu.com,O=\"大众Beijing Baidu Netcom Science Technology Co., Ltd\"大众,OU=service operation department,L=beijing,ST=beijing,C=CN start date: May 09 01:22:02 2019 GMT expire date: Jun 25 05:31:02 2020 GMT common name: baidu.com issuer: CN=GlobalSign Organization Validation CA - SHA256 - G2,O=GlobalSign nv-sa,C=BE> GET / HTTP/1.1> User-Agent: curl/7.29.0> Host: www.baidu.com> Accept: />< HTTP/1.1 200 OK< Accept-Ranges: bytes< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform< Connection: Keep-Alive< Content-Length: 2443< Content-Type: text/html< Date: Fri, 12 Jul 2019 08:26:23 GMT< Etag: \公众588603eb-98b\"大众< Last-Modified: Mon, 23 Jan 2017 13:23:55 GMT< Pragma: no-cache< Server: bfe/1.0.8.18< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/<<!DOCTYPE html>……………… # curl 网页的详细信息
指定访问的要求方法
当然curl默认利用GET办法访问。利用了 -d, --data <data> 选项,那么会默认为 POST方法访问。如果此时还想实现 GET 访问,那么可以利用 -G, --get 选项逼迫curl 利用GET方法访问。
同时 -X, --request <command> 选项也可以指定访问方法。
POST要乞降数据传输
为了抓包查看信息以是利用了 --local-port <num>[-num] 选项,在实际运用中不须要该选项。
[root@iZ28xbsfvc4Z ~]# curl -sv --local-port 9000 -X POST -d 'user=zhang&pwd=123456' http://www.zhangblog.com/2019/06/24/domainexpire/ | head -n1 ## 或者[root@iZ28xbsfvc4Z ~]# curl -sv --local-port 9000 -d 'user=zhang&pwd=123456' http://www.zhangblog.com/2019/06/24/domainexpire/ | head -n1 About to connect to www.zhangblog.com port 80 (#0) Trying 120.27.48.179... Connected to www.zhangblog.com (120.27.48.179) port 80 (#0)> POST /2019/06/24/domainexpire/ HTTP/1.1 # POST 要求方法> User-Agent: curl/7.29.0> Host: www.zhangblog.com> Accept: /> Content-Length: 21> Content-Type: application/x-www-form-urlencoded>} [data not shown] upload completely sent off: 21 out of 21 bytes< HTTP/1.1 405 Not Allowed< Server: nginx/1.14.2< Date: Thu, 18 Jul 2019 07:56:23 GMT< Content-Type: text/html< Content-Length: 173< Connection: keep-alive<{ [data not shown] Connection #0 to host www.zhangblog.com left intact<html>
抓包信息
[root@iZ28xbsfvc4Z tcpdump]# tcpdump -i any port 9000 -A -s 0
指定要求方法
curl -vs -X POST https://www.baidu.com | head -n1
curl -vs -X PUT https://www.baidu.com | head -n1
保存访问网页
利用linux的重定向功能保存
curl www.baidu.com >> baidu.html
利用curl的大O选项
通过 -O, --remote-name 选项实现。
[root@iZ28xbsfvc4Z 20190712]# curl -O https://www.baidu.com # 利用了 -O 选项,必须指定到详细的文件 缺点利用curl: Remote file name has no length!curl: try 'curl --help' or 'curl --manual' for more information[root@iZ28xbsfvc4Z 20190712]# curl -O https://www.baidu.com/index.html # 利用了 -O 选项,必须指定到详细的文件 精确利用% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 2443 100 2443 0 0 13289 0 --:--:-- --:--:-- --:--:-- 13349
利用curl的小o选项
通过 -o, --output <file> 选项实现。
[root@iZ28xbsfvc4Z 20190713]# curl -o sina.txt https://www.sina.com.cn/ # 单个操作[root@iZ28xbsfvc4Z 20190713]# ll-rw-r--r-- 1 root root 154 Jul 13 21:06 sina.txt[root@iZ28xbsfvc4Z 20190703]# curl \"大众http://www.{baidu,douban}.com\"大众 -o \公众site_#1.txt\"大众 # 批量操作,把稳curl 的地址须要用引号括起来[1/2]: http://www.baidu.com --> site_baidu.txt% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 2381 100 2381 0 0 46045 0 --:--:-- --:--:-- --:--:-- 46686[2/2]: http://www.douban.com --> site_douban.txt100 162 100 162 0 0 3173 0 --:--:-- --:--:-- --:--:-- 3173[root@iZ28xbsfvc4Z 20190703]#[root@iZ28xbsfvc4Z 20190703]# lltotal 220-rw-r--r-- 1 root root 2381 Jul 4 16:53 site_baidu.txt-rw-r--r-- 1 root root 162 Jul 4 16:53 site_douban.txt
许可不屈安访问
当我们利用curl进行https访问访问时,如果SSL证书是我们自签发的证书,那么这个时候须要利用 -k, --insecure 选项,许可不屈安的访问。
[root@iZ28xbsfvc4Z ~]# curl https://140.205.16.113/ # 被谢绝curl: (51) Unable to communicate securely with peer: requested domain name does not match the server's certificate.[root@iZ28xbsfvc4Z ~]#[root@iZ28xbsfvc4Z ~]# curl -k https://140.205.16.113/ # 许可实行不屈安的证书连接<!DOCTYPE HTML PUBLIC \公众-//IETF//DTD HTML 2.0//EN\公众><html><head><title>403 Forbidden</title></head><body bgcolor=\公众white\"大众><h1>403 Forbidden</h1><p>You don't have permission to access the URL on this server.<hr/>Powered by Tengine</body></html>
获取HTTP相应状态码
在脚本中,这是很常见的测试网站是否正常的用法。
通过 -w, --write-out <format> 选项实现。
[root@iZ28xbsfvc4Z 20190713]# curl -o /dev/ -s -w %{http_code} https://baidu.com302[root@iZ28xbsfvc4Z 20190713]#[root@iZ28xbsfvc4Z 20190713]#[root@iZ28xbsfvc4Z 20190713]# curl -o /dev/ -s -w %{http_code} https://www.baidu.com200[root@iZ28xbsfvc4Z 20190713]#
指定proxy做事器以及其端口
很多时候上网须要用到代理做事器(比如是利用代理做事器上网或者由于利用curl别人网站而被别人屏蔽IP地址的时候),幸运的是curl通过利用 -x, --proxy <[protocol://][user:password@]proxyhost[:port]> 选项来支持设置代理。
curl -x 192.168.100.100:1080 https://www.baidu.com
模拟浏览器访问
有些网站须要利用特定的浏览器去访问他们,有些还须要利用某些特定的浏览器版本。我们可以通过 -A, --user-agent <agent string> 或者 -H, --header <header> 选项实现仿照浏览器访问。
curl -A \"大众Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/75.0.3770.999\"大众 http://www.zhangblog.com/2019/06/24/domainexpire/ 或者curl -H 'User-Agent: Mozilla/5.0' http://www.zhangblog.com/2019/06/24/domainexpire/
假造referer(盗链)
有些网站的网页对http访问的链接来源做了访问限定,这些限定险些都是通过referer来实现的。
比如:哀求是先访问首页,然后再访问首页中的邮箱页面,这时访问邮箱的referer地址便是访问首页成功后的页面地址。如果做事器创造对邮箱页面访问的referer地址不是首页的地址,就断定那是个盗连了。
可以通过 -e, --referer 或则 -H, --header <header> 实现假造 referer 。
curl -e 'https://www.baidu.com' http://www.zhangblog.com/2019/06/24/domainexpire/或者curl -H 'Referer: https://www.baidu.com' http://www.zhangblog.com/2019/06/24/domainexpire/
布局HTTP要求头
可以通过 -H, --header <header> 实现布局http要求头。
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> 选项实现。
[root@iZ28xbsfvc4Z 20190703]# curl -D baidu_header.info www.baidu.com ………………[root@iZ28xbsfvc4Z 20190703]# lltotal 4-rw-r--r-- 1 root root 400 Jul 3 10:11 baidu_header.info # 天生的头文件
限时访问
--connect-timeout <seconds> 连接做事真个超时时间。这只限定了连接阶段,一旦curl连接了此选项就不再利用了。
# 当前 https://www.zhangXX.com 是国外做事器,访问受限[root@iZ28xbsfvc4Z ~]# curl --connect-timeout 10 https://www.zhangXX.com | head% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0curl: (28) Connection timed out after 10001 milliseconds
-m, --max-time <seconds> 许可全体操作花费的最大韶光(以秒为单位)。这对付防止由于网络或链接变慢而导致批处理作业挂起数小时非常有用。
[root@iZ28xbsfvc4Z ~]# curl -m 10 --limit-rate 5 http://www.baidu.com/ | head # 超过10秒后,断开连接% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed2 2381 2 50 0 0 4 0 0:09:55 0:00:10 0:09:45 4curl: (28) Operation timed out after 10103 milliseconds with 50 out of 2381 bytes received<!DOCTYPE html><!--STATUS OK--><html> <head><met### 或[root@iZ28xbsfvc4Z ~]# curl -m 10 https://www.zhangXX.com | head # 超过10秒后,断开连接% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0curl: (28) Connection timed out after 10001 milliseconds
显示抓取缺点
当我们要求访问失落败时或者没有该网页时,网站一样平常都会给出一个缺点的提示页面。
如果我们不须要这个缺点页面,只想得到简洁的缺点信息。那么可以通过 -f, --fail 选项实现。
[root@iZ28xbsfvc4Z 20190713]# curl http://www.zhangblog.com/201912312<html><head><title>404 Not Found</title></head><body bgcolor=\"大众white\"大众><center><h1>404 Not Found</h1></center><hr><center>nginx/1.14.2</center></body></html>[root@iZ28xbsfvc4Z 20190713]# curl -f http://www.zhangblog.com/201912312 # 得到更简洁的缺点信息curl: (22) The requested URL returned error: 404 Not Found
表单登录与cookie利用
拜会「Linux curl 表单登录或提交与cookie利用」:http://www.zhangblog.com/2019/07/20/curl03/
文件上传与下载
涉及 FTP 做事,大略快速搭建可参考:《CentOS7下安装FTP做事》「https://www.cnblogs.com/zhi-leaf/p/5983550.html」
文件下载网页文件下载
# 以进度条展示,而不是进度表展示[root@iZ28xbsfvc4Z 20190715]# curl -# -o tmp.data2 http://www.zhangblog.com/uploads/tmp/tmp.data######################################################################## 100.0%
FTP文件下载
解释1:个中 ftp1 用户是ftp做事真个账号,详细家目录是:/mnt/ftp1
解释2:当我们利用 curl 通过 FTP 进行下载时,后面跟的路径都是:当前利用的 ftp 账号家目录为根本的相对路径,然后找到的目标文件。
示例1
# 个中 tmp.data 的绝对路径是:/mnt/ftp1/tmpdata/tmp.data ;ftp1 账号的家目录是:/mnt/ftp1# 解释:/tmpdata/tmp.data 这个路径是针对 ftp1 账号的家目录而言的[yun@nginx_proxy01 20190715]$ curl -O ftp://ftp1:123456@172.16.1.195:21/tmpdata/tmp.data# 或者[yun@nginx_proxy01 20190715]$ curl -O -u ftp1:123456 ftp://172.16.1.195:21/tmpdata/tmp.data% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 2048M 100 2048M 0 0 39.5M 0 0:00:51 0:00:51 --:--:-- 143M
示例2
# 个中 nginx-1.14.2.tar.gz 的绝对路径是:/tmp/nginx-1.14.2.tar.gz ;ftp1 账号的家目录是:/mnt/ftp1# 解释:/../../tmp/nginx-1.14.2.tar.gz 这个路径是针对 ftp1 账号的家目录而言的[yun@nginx_proxy01 20190715]$ curl -O ftp://ftp1:123456@172.16.1.195:21/../../tmp/nginx-1.14.2.tar.gz# 或者[yun@nginx_proxy01 20190715]$ curl -O -u ftp1:123456 ftp://172.16.1.195:21/../../tmp/nginx-1.14.2.tar.gz% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 991k 100 991k 0 0 5910k 0 --:--:-- --:--:-- --:--:-- 5937k
文件上传
FTP文件上传
可以通过 -T, --upload-file <file> 选项实现。
解释1:个中 ftp1 用户是ftp做事真个账号,详细家目录是:/mnt/ftp1
# 个中 tmp_client.data 是客户端本地文件; # /tmpdata/ 这个路径是针对 ftp1 账号的家目录而言的,且上传时该目录必须是存在的,否则上传失落败。# 因此上传后文件在ftp做事真个绝对路径是:/mnt/ftp1/tmpdata/tmp_client.data[yun@nginx_proxy01 20190715]$ curl -T tmp_client.data ftp://ftp1:123456@172.16.1.195:21/tmpdata/# 或者[yun@nginx_proxy01 20190715]$ curl -T tmp_client.data -u ftp1:123456 ftp://172.16.1.195:21/tmpdata/% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 2048M 0 0 100 2048M 0 95.4M 0:00:21 0:00:21 --:--:-- 49.3M
断点续传
利用 -C, --continue-at <offset> 选项实现。个中利用 “-C -”「把稳有空格和无空格的情形」,见告curl自动找出在哪里/如何规复传输。
网页端断点续传下载
curl -C - -o tmp.data http://www.zhangblog.com/uploads/tmp/tmp.data # 下载一个 2G 的文件
FTP断点续传下载
细节就不多说了,可拜会上面的「FTP文件下载」
curl -C - -o tmp.data1 ftp://ftp1:123456@172.16.1.195:21/tmpdata/tmp.data # 下载一个 2G 的文件# 或则curl -C - -o tmp.data1 -u ftp1:123456 ftp://172.16.1.195:21/tmpdata/tmp.data # 下载一个 2G 的文件
分段下载
有时文件比较大,或者难以迅速传输,而利用分段传输,可以实现稳定、高效并且有保障的传输,更具有实用性,同时随意马虎对差错文件进行更正。
可利用 -r, --range <range> 选项实现。
如下示例利用了同一张图片,大小为 18196 字节。
网页端分段下载分段下载
[root@iZ28xbsfvc4Z 20190715]# curl -I http://www.zhangblog.com/uploads/hexo/00.jpg # 查看文件大小HTTP/1.1 200 OKServer: nginx/1.14.2Date: Mon, 15 Jul 2019 03:23:44 GMTContent-Type: image/jpegContent-Length: 18196 # 文件大小Last-Modified: Fri, 05 Jul 2019 08:04:58 GMTConnection: keep-aliveETag: \"大众5d1f04aa-4714\"大众Accept-Ranges: bytes### 分段下载一个文件[root@iZ28xbsfvc4Z 20190715]# curl -r 0-499 -o 00-jpg.part1 http://www.zhangblog.com/uploads/hexo/00.jpg[root@iZ28xbsfvc4Z 20190715]# curl -r 500-999 -o 00-jpg.part2 http://www.zhangblog.com/uploads/hexo/00.jpg[root@iZ28xbsfvc4Z 20190715]# curl -r 1000- -o 00-jpg.part3 http://www.zhangblog.com/uploads/hexo/00.jpg
查看下载文件
[root@iZ28xbsfvc4Z 20190715]# lltotal 36-rw-r--r-- 1 root root 500 Jul 15 11:25 00-jpg.part1-rw-r--r-- 1 root root 500 Jul 15 11:25 00-jpg.part2-rw-r--r-- 1 root root 17196 Jul 15 11:26 00-jpg.part3
文件合并
[root@iZ28xbsfvc4Z 20190715]# cat 00-jpg.part1 00-jpg.part2 00-jpg.part3 > 00.jpg[root@iZ28xbsfvc4Z 20190715]# ll 00.jpgtotal 56-rw-r--r-- 1 root root 18196 Jul 15 11:29 00.jpg
FTP分段下载分段下载
[yun@nginx_proxy01 20190715]$ curl -r 0-499 -o 00-jpg.part1 ftp://ftp1:123456@172.16.1.195:21/tmpdata/00.jpg[yun@nginx_proxy01 20190715]$ curl -r 500-999 -o 00-jpg.part2 ftp://ftp1:123456@172.16.1.195:21/tmpdata/00.jpg[yun@nginx_proxy01 20190715]$ curl -r 1000- -o 00-jpg.part3 ftp://ftp1:123456@172.16.1.195:21/tmpdata/00.jpg
查看下载文件
[yun@nginx_proxy01 20190715]$ ll 00-jpg.part-rw-rw-r-- 1 yun yun 500 Jul 15 17:59 00-jpg.part1-rw-rw-r-- 1 yun yun 500 Jul 15 18:00 00-jpg.part2-rw-rw-r-- 1 yun yun 17196 Jul 15 18:00 00-jpg.part3
文件合并
[yun@nginx_proxy01 20190715]$ cat 00-jpg.part1 00-jpg.part2 00-jpg.part3 > 00.jpg[yun@nginx_proxy01 20190715]$ ll 00.jpg-rw-rw-r-- 1 yun yun 18196 Jul 15 18:02 00.jpg
声明:本文为CSDN博主「LightZhang666」的原创文章,版权归作者所有,如需转载请联系作者。
原文:https://blog.csdn.net/woshizhangliang999/article/details/98946071
【End】