用curl对ip地址归属地查询
上一节测试题目
上一节测试题目都是将那些命令自己手动测试下。
curl 命令
curl
命令是可以完成http和https协议的GET、POST、PUT等http请求的命令行工具,并且支持对请求设置代理。功能非常强大,可以用它来做linux的爬虫。由于今天我们不是主要介绍curl命令,所以我们只简单说下curl命令的GET请求。
用curl 发送GET请求
先看下命令:
curl -s http://ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5
上面这个命令,就是向http://ip.taobao.com/servicce/getIpInfo.php
发送http的get请求,并且带有参数ip=223.5.5.5
。执行命令后显示的结果就是返回的查询结果,其中-s
参数是不显示进度日志。

看上图可以看到ip.taobao.com
给我们返回的数据是json
格式(一种数据存储格式)的,我们要想看具体的地理位置需要对此数据进行处理分析,将地理位置筛选出来。所以,需要将这些输出交给一个jq
工具进行处理。那么如何将数据交个jq
呢?用|
管道符就可以将curl
的结果转交给jq
。
|
管道符
|
这个竖线符合,在linux下有特殊意义,它就是管道符号。
什么是管道
我们如果把linux下的命令都比喻成一个净水器的滤芯,它们分别可以过滤水中不同的杂质,那么管道符合就相当于连接两个滤芯的水管。而这个水管内运送的水,就代表上一个滤芯的标准输出,由管道将此标准输出送给下一个滤芯。然后这些水作为下一个滤芯的标准输入。
下面我们来简单演示下,先用vim test
创建并编辑文件并输入下面内容:
hello wrold
hi 52robot.org
用cat
命令可以查看文件内容
#cat 命令可以将文件内容输出的终端
cat test
用grep
可以查找test
文件含有52robot
字符的行,并且在终端输出
grep "52robot" test
上面我门了解了cat
和grep
命令,现在我们就可以用|
将他们连接起来。
cat test| grep "52robot"
这个操作是先有cat
命令将test
文件的内容放到标准输出,然后通过管道符合|
传给grep
作为它的标准输入,这样grep
命令最后也就不用再写文件名了。
发送请求并处理数据
上面我们了解了管道符,下面我们用将curl
的结果交给jq
试下:
curl http://-s ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5|jq '.'

这里我们简单介绍下jq
怎么提取json里面的部分字段:
我们把json的数据理解成一个树状结构的一个字典,其中.
代表这个最顶级的一个字典。而
.data
代表json里面data
关键字对应的键值;.data.country
代表上文结果的中国
;.data.region
代表上文的浙江省
;.data.city
代表上文的杭州市
。
下面我们再来试试:
# 用+ 号可以将多个字段合并
curl -s http://ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5|jq '.data.country + .data.region + .data.city'

可以看到这个结果这就是我们想要的地理位置,它包括了国家、省、市。
本节测试
自己尝试改改输出,可以将所属区域和网络接入运营商也加入的查询的结果。
下一节预告
下节我们会将本节的这个命令写入脚本,让它支持传入IP参数,并同时可以直接作为系统命令来调用。
关注我们了解更多原创文章
