Linux工具之curl
curl是一个利用url规则在命令行下工作的文件传输工具,它支持文件的上传和下载,在测试一些RESTful接口的时候也会经常用到,因此非常有必要了解它的使用。
用法
下载
大部分操作系统内置了curl
工具,因此安装部分笔记不作过多说明。
下载之后使用curl --help
命令查看安装情况和使用说明。
使用
我使用wiresharks来抓取curl发送的http数据包来学习curl,笔记暂时只涉及http协议,https协议部分TODO
。
目录:
简单使用
curl <url>
默认使用GET方法,请求url,默认代理,测试抓取baidu首页并展示wiresharks抓取结果如下:
curl执行结果
wiresharks抓取结果
可以看到curl默认设置Host、User-Agent、Accept,其中User-Agent默认为curl+版本号。
设置请求方法
HTTP有多种请求方法,常见的有GET、POST、PUT、DELETE,在curl中使用-X
(大写X)选项设置,默认为GET。
curl -X GET <url>
curl -X POST <url>
curl -X PUT <url>
curl -X DELETE <url>
GET
POST
PUT
baidu主页不支持PUT所以返回错误代码。
DELETE
baidu主页不支持DELETE所以返回错误代码。
POST数据
当我们需要使用POST方法时,往往会需要传输数据,curl使用-d
参数设置输入数据。
curl -d "name1=value1&name2=value2" <url>
curl -H "Content-type: application/json" -d '{"name1": "value1", "name2": "value2"}' <url>
第一种方法
第二种方法
可以看到两种方法的content-type是不一样的,一般来说,第一种方法用于添加url参数,第二种方法用于POST添加body,两种方式是有区别的。并且如果需要添加带列表的对象,建议采用第二种方式。
设置HTTP请求头部
在上一节填写POST数据时第二种方式使用-H
参数添加了一个头部,其它头部信息也可以按照这种方式添加:
curl -H 'key: value' <url>
Example
查看HTTP头部
使用-i
参数可以查看响应头部信息,也可以使用-I
和-v
参数。
curl -i <url> #head 和 body
curl -I <url> #只有head
curl -v <url> #请求和响应的head 和 body
测试
第三种方式可以查看请求和响应的头部,使用wiresharks对比两个头部:
两个头部是一样的,因此可以使用curl直接查看http请求和响应。
设置Refer
在http的head中,refer常常会被服务器检查是否是盗链,比如某一个页面A,它只有一个入口页面B,只能允许通过这个入口进来,但是由于可能有人通过自制的页面,点击页面A的链接转到A来,那么为了能够监测这种情况,在从B点击链接进入A的时候,会在request里添加一个Refer,其值为B,表示这个请求是从页面B发出的。curl也支持设置Refer,来下载一些有防盗链措施的文件。
curl -e <referUrl> <url>
Example
设置用户代理
默认curl代理是curl本身,有些站点会对一些小型代理进行限制,因此,在请求一些资源的时候我们需要模拟成一些大型用户代理,比如Chrome、Safari等等。
curl -A <user-agent> <url>
Example
跟踪跳转
有些url会通过设置response head来指向另一个url,http_code会设置为30X,浏览器一般会自动跳转到新的url获取数据,这个过程对用户透明,因此我们感觉不到这个现象;但是curl默认是单个请求,因此连接一次之后就不再进行,这时候用户会获取不到访问数据,但是可以设置跟踪跳转实现获取跳转之后对页面。
之前的示例访问baidu.com可以发现返回的http状态码是302,这表明这并不是资源的目标地址,因此我们想要获取baidu.com首页实际内容,可以使用-L
参数。
curl -L <url>
Example
在终端执行了curl -L baidu.com -v
之后,可以观察到输出中包含有两次请求,第一次请求中head里边有Location选项,第二次请求会请求这条地址获取实际资源内容,如果第二条资源依旧是跳转,那么curl会再次发送请求。
cookie的保存和使用
由于http是一个无状态的协议,而跟踪用户行为是当前各大移动应用都需要关心的事情,比较常见的方式就是适用cookie。我们在初次访问一个网站的时候,网站会返回一个cookie,在http的head里边,浏览器自动帮我们保存了这个cookie,之后再次访问这个网站的时候浏览器会带上这个cookie,附加在请求的head里边。
我们先测试正常浏览器访问的时候的cookie:
请求baidu首页
可以看到在response里边附加了baidu服务器返回给我们的cookie,我们可以尝试点击某个链接然后查看request里边的cookie。
点击baidu首页子页面
可以看到response的cookie现在被添加到request里边了。
#保存本次请求响应中的cookie到<cookie-file>里
curl -c <cookie-file> <url>
#使用cookie-file发起本次请求
curl -b <cookie-file> <url>
#使用cookie-string发起本次请求
curl -b <cookie-string> <url>
Example
两种方式都可以设置请求cookie,按照需求选择即可。
常用功能
下载资源
#下载百度首页logo
#-o参数指定输出文件路径
#也可以使用-O大写,表示按照资源本身名字命名,不需要参数
curl -o logo.jpg https://www.baidu.com/img/bd_logo1.png
#curl -O https://www.baidu.com/img/bd_logo1.png
查看本机外网ip
本地局域网ip可以在终端下执行ifconfig查看,但是看不到自己的外网ip。
curl icanhazip.com
Example
查看远程主机ip
curl -o /dev/null -s -w %{remote_ip} <url>
Example
查看url请求状态码
curl -o /dev/null -s -w %{http_code} <url>
Example
结尾
curl是一个非常优秀的工具,不仅仅是上边提到的功能,它还有很多灵活的选项来满足我们在终端下的各种需求。可以通过man curl
和curl --help
查看更多的帮助。