Aitter's Blog

MAC之http命令行工具curl

curl 是一个用来进行HTTP访问的命令(和函数库)。用curl可以模拟浏览器对特定的网站进行通信。

curl 可以为前端开发者提供http测试功能,例如:

  • 测试 GET 或 POST 请求
  • 请求某地址时,添加cookie,请求头信息等
  • 查看Request Header 和 Response Header
  • 查看请求过程
  • ftp操作

查看网页源码

curl 后面跟网址,就可以下载指定网址的页面源码了

curl www.sina.com
//结果
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

下载保存网页

curl -o page.html http://www.yahoo.com

使用代理访问

curl -x 123.45.67.89:1080 -o page.html http://www.yahoo.com

操作cookie

先访问指定网址,将cookie保存到文件中如cookie01.txt
下次访问该网址时,再将cookie添加到请求头中

curl -D cookie0001.txt http://www.yahoo.com
curl -D cookie0002.txt -b cookie0001.txt http://www.yahoo.com

网址跳转

上面新浪的网址是 www.sina.com 而当我们打开时,网页会自动跳转到 www.sina.com.cn
使用curl方向可以自动跳转到 www.sina.com.cn 并下载源码

curl -L www.sina.com

显示响应头信息

-i 显示响应头信息和body内容,-I 只显示响应头信息

curl -i www.sina.com
//结果
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 21 Mar 2016 05:14:26 GMT
Content-Type: text/html
Location: http://www.sina.com.cn/
Expires: Mon, 21 Mar 2016 05:16:26 GMT
Cache-Control: max-age=120
Age: 109
Content-Length: 178
X-Cache: HIT from ctc.nj.1cf2.176.spool.sina.com.cn
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

显示通信过程

-v参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。

curl -v www.sina.com
* Rebuilt URL to: www.sina.com/
* Trying 202.102.75.147...
* Connected to www.sina.com (202.102.75.147) port 80 (#0)
> GET / HTTP/1.1
> Host: www.sina.com
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Mon, 21 Mar 2016 05:18:43 GMT
< Content-Type: text/html
< Location: http://www.sina.com.cn/
< Expires: Mon, 21 Mar 2016 05:20:43 GMT
< Cache-Control: max-age=120
< Age: 50
< Content-Length: 178
< X-Cache: HIT from ctc.nj.1cf2.179.spool.sina.com.cn
<
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host www.sina.com left intact

查看更详细的通信过程, 并保存至文件

curl --trace-ascii output.txt www.sina.com

GET请求

curl 127.0.0.1:8899/index.html?name=jack

POST请求

添加 --data-D 后面跟传递的参数,再加网址,即可发送POST请求

curl -D "name=jack&age=22" 127.0.0.1:8899/post

如果要对数据内容做编码处理,可使用 –data-urlencode 参数

curl -D "name=jack jason&age=22" 127.0.0.1:8899/post

文件上传

假定文件上传的表单是下面这样:

<form method="POST" enctype='multipart/form-data' action="upload.cgi">
 <input type=file name=upload>
 <input type=submit name=press value="OK">
</form>

可以用curl这样上传文件:

curl --form upload=@localfilename --form press=OK 127.0.0.1:8899/upload

添加 referer 字段

有一些防盗链网站通过请求头中的 referer 信息来判断是否为盗链,curl可以任意修改referer信息
添加参数 --referer-e 给请求头中添加referer信息

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

添加浏览器信息

有些网站,如淘宝会对用户使用的浏览器做检测适配处理,添加特定的浏览器信息可以模拟真实的浏览器访问

curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

这样,服务器端接到访问的要求,会认为你是一个运行在Windows 2000上的IE6.0

下载文件

添加 -o-O 参数,

curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG
curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

模拟断点下载

比如我们有一个http://cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 要下载
我们就可以用这样的命令:

curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &
curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &
curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &
curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3

这样就可以分块下载啦。
不过你需要自己把这些破碎的文件合并起来
如果你用UNIX或苹果,用 cat zhao.part* > zhao.mp3就可以
如果用的是Windows,用copy /b 来解决

添加本地证书

比如 https的时候使用本地证书,就可以这样

curl -E localcert.pem https://remote_server

用curl通过dict协议去查字典

curl dict://dict.org/d:computer

ftp下载上传

curl -u name:passwd ftp://ip:port/path/file
curl -T localfile -u name:passwd ftp://upload_site:port/path/

阅读参考
mac系统命令行curl详解
curl: 命令行的Http协议工具
curl网站开发指南