文章作者:Tyan
博客:noahsnail.com | CSDN |
1. CURL介绍
CURL,全称Command Line URL Viewer,是一个Linux命令行工具,能从服务器下载数据,也能往服务器上发送数据,支持多种协议,支持的协议有:DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP,RTSP,SCP,SFTP,SMB,SMBS,SMTP,SMTPS,TELNET和TFTP。从CURL支持的协议就可以看出,CURL命令非常强大。
2. CURL命令用法
2.1 curl url
# 命令形式:$ curl url,访问网页,url为网页的网址,开发中可以用来查看API的返回值
# 访问百度主页,返回的是百度主页的网页源码
$ curl www.baidu.com
百度一下,你就知道
2.2 curl -o/-O filename url
# 命令形式:$ curl -o/-O filename url,保存访问的网页或文件,-o参数是保存,filename是要保存的文件名,-O是将远端的文件以远端文件的文件名自动保存到本地,这个命令主要是下载文件,如果需要获取多个文件,可以采用curl -O url1 -O url2
# 访问百度主页,并将访问内容保存到baidu.html中
$ curl -o baidu.html www.baidu.com
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2381 100 2381 0 0 34934 0 --:--:-- --:--:-- --:--:-- 35537
# 从远端服务器下载一张图片,保存为1.jpg
$ curl -o 1.jpg http://ocs628urt.bkt.clouddn.com/table_1.1.png
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 126k 100 126k 0 0 161k 0 --:--:-- --:--:-- --:--:-- 161k
# 从远程服务器下载一张图片,保存的文件名为图片在远程服务器上的名字
$ curl -O http://ocs628urt.bkt.clouddn.com/table_1.1.png
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 126k 100 126k 0 0 132k 0 --:--:-- --:--:-- --:--:-- 132k
# 下载多个文件
$ curl -O http://ocs628urt.bkt.clouddn.com/table_1.1.png -O http://ocs628urt.bkt.clouddn.com/table_java_2.png
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 126k 100 126k 0 0 402k 0 --:--:-- --:--:-- --:--:-- 402k
100 153k 100 153k 0 0 33822 0 0:00:04 0:00:04 --:--:-- 42510
2.3 curl -i/-I url
# 命令形式:$ curl -i url,访问网页并显示response信息,-i参数是显示response信息,-I参数是只显示response信息
# 访问百度主页,并将访问内容保存到baidu.html中
$ curl -i www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Wed, 02 Nov 2016 09:36:25 GMT
Content-Type: text/html
Content-Length: 2381
Last-Modified: Mon, 25 Jul 2016 11:11:28 GMT
Connection: Keep-Alive
ETag: "5795f3e0-94d"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
Accept-Ranges: bytes
百度一下,你就知道
# 只显示response信息
$ curl -I www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Wed, 02 Nov 2016 09:38:06 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:00 GMT
Connection: Keep-Alive
ETag: "575e1f58-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
备注:
HTTP/1.1 200 OK,响应状态行
HTTP/1.1,访问采用的协议为HTTP,版本为1.1
200 OK,HTTP状态码,表示文档正确返回
Server,服务器应用程序软件的名称和版本
Date,服务器产生响应的日期
Content-Type,响应实体的主题是一个html文本
Content-Length,响应实体的主题包含了277字节的数据
Last-Modified,资源的最后修改日期时间
Connection,连接方式,close或keep-alive
ETag,资源的匹配信息
Cache-Control,控制缓存的行为
Pragma,报文指令
Accept-Ranges,是否接受字节范围请求
2.4 curl -v url/curl --trace filename url
# 命令形式:$ crul -v url,-v参数是显示http访问的整个过程,即整个通信过程,curl --trace filename url相比-v信息更详细,并且会将访问过程输出到一个文件中
$ curl -v www.baidu.com
* Rebuilt URL to: www.baidu.com/
* Trying 61.135.169.121...
* Connected to www.baidu.com (61.135.169.121) port 80 (#0)
> GET / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: bfe/1.0.8.18
< Date: Wed, 02 Nov 2016 10:08:13 GMT
< Content-Type: text/html
< Content-Length: 2381
< Last-Modified: Mon, 25 Jul 2016 11:11:30 GMT
< Connection: Keep-Alive
< ETag: "5795f3e2-94d"
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Pragma: no-cache
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
< Accept-Ranges: bytes
<
百度一下,你就知道
* Connection #0 to host www.baidu.com left intact
# 访问百度,访问的详细信息输出到output.txt文件中
$ curl --trace output.txt www.baidu.com
百度一下,你就知道
2.5 curl --header "Content-Type:application/json" www.baidu.com
# 命令形式:curl --header "header content" url,--header主要是设置request请求的头部,Content-Type:application/json就是JS中ajax请求中的Content-Type:application/json
$ curl --header "Content-Type:application/json" www.baidu.com
百度一下,你就知道
2.6 curl -L url
# 命令形式:curl -L url,-L是对页面进行重定向,主要用在请求的页面移动到别的站点的情况下。默认情况下CURL不会发送HTTP Location headers(重定向)
# 访问新浪,内容就不展示了,太多了,可以自己试一下
$ curl -L www.sina.com
2.7 curl -C - -O url
# 命令形式:curl -C - -O url,-C -下载大文件时支持断点续传功能,-C后面要有一个整数,-C -/--continue-at命令等价
$ curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1375k 100 1375k 0 0 13479 0 0:01:44 0:01:44 --:--:-- 6633
2.8 curl url >> filename
# 命令形式:curl url >> filename,利用linux重定向功能将访问的内容输出到文件中
# 访问百度并将网页输出到baidu.html中,与curl -o baidu.html www.baidu.com等价
$ curl www.baidu.com >> baidu.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2381 100 2381 0 0 1512 0 0:00:01 0:00:01 --:--:-- 1512
2.9 curl --limit-rate 1K url
命令形式:curl --limit-rate 1K url,限制访问网络速度到1K,可用G,M,K,B
# 以1K的网速访问百度
$ curl --limit-rate 1K www.baidu.com
百度一下,你就知道
2.10 curl -u username url/curl --user username:password url
# 命令形式:curl -u username url,用用户名访问页面,当页面访问需要授权时使用,或者直接使用curl --user username:password url访问,最好用第一种形式,防止密码泄露
# 用用户名访问百度
$ curl -u 24782*****@qq.com www.baidu.com
Enter host password for user '24782*****@qq.com':
百度一下,你就知道
# 用户名和密码访问百度
$ curl --user 24782*****@qq.com:****** www.baidu.com
百度一下,你就知道
2.11 curl -z date url
# 命令形式:curl -z date url,date指定时间,在date之后文件更新过之后才会下载,可以与response的last-modified联系到一起,工作中会用到,当要更新数据时,先查看last-modified
# 正常访问http://www.example.com/yy.html
$ curl http://www.example.com/yy.html
Example Domain
Example Domain
This domain is established to be used for illustrative examples in documents. You may use this
domain in examples without prior coordination or asking for permission.
# 查看网页的last-modified
$ curl -I http://www.example.com/yy.html
HTTP/1.1 404 Not Found
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html
Date: Wed, 02 Nov 2016 14:41:48 GMT
Etag: "359670651+gzip"
Expires: Wed, 09 Nov 2016 14:41:48 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (cpm/F9B3)
X-Cache: HIT
x-ec-custom-error: 1
Content-Length: 1270
# 指定时间为2016年6月18日,在那之后页面有更新才会访问
$ curl -z 18-Jun-16 http://www.example.com/yy.html
$
2.12 curl -x proxyip:port url
# 命令形式:curl -x proxyip:port url,代理服务器如果是买的,需要输入用户名和密码
# 用代理访问百度,需要用户名和密码
$ curl -u -x 138.128.***.***:8*** www.baidu.com
Enter host password for user '-x':
curl: (52) Empty reply from server
百度一下,你就知道
2.13 curl -D/-b/-c filename url
# 命令形式:url -D filename url,-D是将header信息(包括cookie)保存到文件中, -b是使用上次保存的Cookie信息,从文件中读取Cookie,也可指定Cookie文本,-c是接收Cookie并保存
# 访问百度并将header信息保存到test中
$ curl -D test www.baidu.com
百度一下,你就知道
# test文件内容
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Wed, 02 Nov 2016 15:08:31 GMT
Content-Type: text/html
Content-Length: 2381
Last-Modified: Mon, 25 Jul 2016 11:11:41 GMT
Connection: Keep-Alive
ETag: "5795f3ed-94d"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
Accept-Ranges: bytes
# 访问百度将Cookie信息保存到test中
$ curl -c test www.baidu.com
百度一下,你就知道
# 使用保存的Cookie信息test访问百度
$ curl -b test www.baidu.com
百度一下,你就知道
# 使用Cookie文本访问百度
$ curl -b "name=test;pwd=test;" www.baidu.com
百度一下,你就知道
2.14 curl -G -d "text" url
# 命令形式:curl -G -d "text" url,-G是以GET方式访问,-d "test"是指定GET的请求数据
# 以Get方式提交数据并访问百度,可以用来测试API
$ curl -G -d "name=test" www.baidu.com
百度一下,你就知道
2.15 curl -# url
# 命令形式:curl -# url,-#表示访问时以进度条形式显示,常用在下载中
# 下载图片并显示进度条
$ curl -# -O http://ocs628urt.bkt.clouddn.com/table_1.1.png
######################################################################## 100.0%
2.16 curl -A/--user-agent "text" url
# 命令形式:curl -A/--user-agent "text" url,-A/--user-agent "text"指定了访问者的设备信息,包括系统、CPU、浏览器版本等等。可以隐藏真正的设备信息
# 指定访问设备信息来访问百度
$ curl -A "Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 5.0)" www.baidu.com
302 Found
302 Found
pr-nginx_1-0-304_BRANCH Branch
Time : Tue Oct 18 14:33:14 CST 2016
2.17 curl -e/--referer url1 url2
# 命令形式:curl -e/--referer url1 url2,-e/--referer表明是从url1跳转访问url2的
# 从example.com跳转访问百度
$ curl --referer example.com www.baidu.com
百度一下,你就知道
2.18 curl -X POST url
# 命令形式:curl -X POST url,-X POST,指定其它形式访问url,curl默认使用的HTTP的GET方法,-X可以指定其它方法,例如POST,DELETE,PUT等,使用POST时可以使用-d "text"来指定POST的数据
# 以POST方式访问example.com
$ curl -X POST example.com
411 - Length Required
411 - Length Required
# 以POST+Data的方式访问example.com
$ curl -X POST -d "name=test" example.com
Example Domain
Example Domain
This domain is established to be used for illustrative examples in documents. You may use this
domain in examples without prior coordination or asking for permission.
3. 总结
CURL的命令参数还有很多,就不一一演示了。下面是CURL的参数及功能列表:
-a/--append 上传文件时,附加到目标文件
-A/--user-agent 设置用户代理发送给服务器
- anyauth 可以使用“任何”身份验证方法
-b/--cookie cookie字符串或文件读取位置
- basic 使用HTTP基本验证
-B/--use-ascii 使用ASCII /文本传输
-c/--cookie-jar 操作结束后把cookie写入到这个文件中
-C/--continue-at 断点续转
-d/--data HTTP POST方式传送数据
--data-ascii 以ascii的方式post数据
--data-binary 以二进制的方式post数据
--negotiate 使用HTTP身份验证
--digest 使用数字身份验证
--disable-eprt 禁止使用EPRT或LPRT
--disable-epsv 禁止使用EPSV
-D/--dump-header 把header信息写入到该文件中
--egd-file 为随机数据(SSL)设置EGD socket路径
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer 来源网址
-E/--cert 客户端证书文件和密码 (SSL)
--cert-type 证书文件类型 (DER/PEM/ENG) (SSL)
--key 私钥文件名 (SSL)
--key-type 私钥文件类型 (DER/PEM/ENG) (SSL)
--pass 私钥密码 (SSL)
--engine 加密引擎使用 (SSL). "--engine list" for list
--cacert CA证书 (SSL)
--capath CA目录 (made using c_rehash) to verify peer against (SSL)
--ciphers SSL密码
--compressed 要求返回是压缩的形势 (using deflate or gzip)
--connect-timeout 设置最大请求时间
--create-dirs 建立本地目录的目录层次结构
--crlf 上传是把LF转变成CRLF
-f/--fail 连接失败时不显示http错误
--ftp-create-dirs 如果远程目录不存在,创建远程目录
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
--ftp-pasv 使用 PASV/EPSV 代替端口
--ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
--ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输
--ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输
-F/--form 模拟http表单提交数据
-form-string 模拟http表单提交数据
-g/--globoff 禁用网址序列和范围使用{}和[]
-G/--get 以get的方式来发送数据
-h/--help 帮助
-H/--header 自定义头信息传递给服务器
--ignore-content-length 忽略的HTTP头信息的长度
-i/--include 输出时包括protocol头信息
-I/--head 只显示文档信息
从文件中读取-j/--junk-session-cookies忽略会话Cookie
- 界面指定网络接口/地址使用
- krb4 <级别>启用与指定的安全级别krb4
-j/--junk-session-cookies 读取文件进忽略session cookie
--interface 使用指定网络接口/地址
--krb4 使用指定安全级别的krb4
-k/--insecure 允许不使用证书到SSL站点
-K/--config 指定的配置文件读取
-l/--list-only 列出ftp目录下的文件名称
--limit-rate 设置传输速度
--local-port 强制使用本地端口号
-m/--max-time 设置最大传输时间
--max-redirs 设置最大读取的目录数
--max-filesize 设置最大下载的文件总量
-M/--manual 显示全手动
-n/--netrc 从netrc文件中读取用户名和密码
--netrc-optional 使用 .netrc 或者 URL来覆盖-n
--ntlm 使用 HTTP NTLM 身份验证
-N/--no-buffer 禁用缓冲输出
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-p/--proxytunnel 使用HTTP代理
--proxy-anyauth 选择任一代理身份验证方法
--proxy-basic 在代理上使用基本身份验证
--proxy-digest 在代理上使用数字身份验证
--proxy-ntlm 在代理上使用ntlm身份验证
-P/--ftp-port 使用端口地址,而不是使用PASV
-Q/--quote 文件传输前,发送命令到服务器
-r/--range 检索来自HTTP/1.1或FTP服务器字节范围
--range-file 读取(SSL)的随机文件
-R/--remote-time 在本地生成文件时,保留远程文件时间
--retry 传输出现问题时,重试的次数
--retry-delay 传输出现问题时,设置重试间隔时间
--retry-max-time 传输出现问题时,设置最大重试时间
-s/--silent静音模式。不输出任何东西
-S/--show-error 显示错误
--socks4 用socks4代理给定主机和端口
--socks5 用socks5代理给定主机和端口
--stderr
-t/--telnet-option Telnet选项设置
--trace 对指定文件进行debug
--trace-ascii Like --跟踪但没有hex输出
--trace-time 跟踪/详细输出时,添加时间戳
-T/--upload-file 上传文件
--url Spet URL to work with
-u/--user 设置服务器的用户和密码
-U/--proxy-user 设置代理用户名和密码
-v/--verbose
-V/--version 显示版本信息
-w/--write-out [format]什么输出完成后
-x/--proxy 在给定的端口上使用HTTP代理
-X/--request 指定什么命令
-y/--speed-time 放弃限速所要的时间。默认为30
-Y/--speed-limit 停止传输速度的限制,速度时间'秒
-z/--time-cond 传送时间设置
-0/--http1.0 使用HTTP 1.0
-1/--tlsv1 使用TLSv1(SSL)
-2/--sslv2 使用SSLv2的(SSL)
-3/--sslv3 使用的SSLv3(SSL)
--3p-quote like -Q for the source URL for 3rd party transfer
--3p-url 使用url,进行第三方传送
--3p-user 使用用户名和密码,进行第三方传送
-4/--ipv4 使用IP4
-6/--ipv6 使用IP6
-#/--progress-bar 用进度条显示当前的传送状态
参考文献:
https://curl.haxx.se/
http://www.ruanyifeng.com/blog/2011/09/curl.html
http://www.cnblogs.com/gbyukg/p/3326825.html
http://blog.csdn.net/wangjunji34478/article/details/35988223
http://blog.51yip.com/linux/1049.html