IP归属地分析Shell脚本
分类:linux日期:2014-06-07 - 10:18:54作者:老谢
看到一个结合Python转码的IP归属地分析Shell脚本的脚本,对这个脚本挺感兴趣,于是就拿过来测试一下,但是发现脚本执行后无法执行输出ip的信息:
[root@xj123 ip]# ./ip.sh IP地址 国家 运营商 区域 省份 城市 县/区 ====================================================================== 114.216.229.147 |
由于不懂脚本就请教了D大,在此再次非常感谢D大不吝赐教(大晚上的打扰休息实在是不好意思的哈。。。),下面继续回到正题:
在D大的指导下,直接执行命令,看看能不能获取到数据:
[root@xj123 ip]curl -s http://ip.taobao.com/service/getIpInfo.php?ip=114.216.229.147 | sed 's/,/\n/g' | ./TransCoding.py | tr -d "{}\"" code:0 data:country:ä¸å½ counträ¸:CN area_id:300000 region:æ±èç region_id:320000 city:èå·å¸ city_id:320500 county: county_id:-1 isp:çµä¿¡ isp_id:100017 |
可以看到实际上获取到的数据,但是乱码,乱码先不管,先让脚本跑起来再说,目前脚本抓取信息是正常了,经过D大对脚本的检查,发现脚本的每局结尾少了一个`符号,补上之后ip.sh的脚本如下:
#!/bin/bash ipInfo() { for i in `cat list` do TransCoding="/usr/bin/python TransCoding.py" JsonDate="curl -s http://ip.taobao.com/service/getIpInfo.php?ip=$i" country=`$JsonDate | sed 's/,/\n/g' | $TransCoding | tr -d "{}\"" | awk -F ":" 'NR==2{print $3}'` area=`$JsonDate | sed 's/,/\n/g' | $TransCoding | tr -d "{}\"" | awk -F ":" 'NR==4{print $2}'` region=`$JsonDate | sed 's/,/\n/g' | $TransCoding | tr -d "{}\"" | awk -F ":" 'NR==6{print $2}'` city=`$JsonDate | sed 's/,/\n/g' | $TransCoding | tr -d "{}\"" | awk -F ":" 'NR==8{print $2}'` county=`$JsonDate | sed 's/,/\n/g' | $TransCoding | tr -d "{}\"" | awk -F ":" 'NR==10{print $2}'` isp=`$JsonDate | sed 's/,/\n/g' | $TransCoding | tr -d "{}\"" | awk -F ":" 'NR==12{print $2}'` printf "%-18s\t%-8s\t%-8s\t%-8s\t%-8s\t%-8s\t%-8s\n" $i $country $isp $area $region $city $county done } printf "%-18s\t%-8s\t%-8s\t%-8s\t%-8s\t%-8s\t%-8s\n" IP地址 国家 运营商 区域 省份 城市 县/区 echo -e "\e[1;33m======================================================================\e[0m" ipInfo; |
TransCoding.py的脚本如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- import re import sys def main(): for line in sys.stdin: sys.stdout.write(re.sub(r'\\u\w{4}', lambda e: unichr(int(e.group(0)[2:], 16)).encode('utf-8'), line)) if __name__ == '__main__': main() |
执行脚本,检查输出情况:
在windows系统下使用putty,脚本中的中文输出正常,远程抓取的数据输出乱码,同时发现一个奇怪的问题,OS X下面脚本输出乱码,但是远程数据的中文输出正常:
乱码一般是由于编码导致的,下面开始检查编码是否一致,经D大的提醒一定要统一编码,下面先检查服务器的编码是否正确:
[root@xj123 ip]# echo $LANG en_US.UTF-8 |
远程服务器的编码为UTF-8没问题,接着检查终端的编码格式,发现putty的编码格式使用了Use font encoding,远程服务器使用UTF-8的编码,应该没问题,先改成UTF-8试试,然后再执行脚本,发现输出跟OS X一样,脚本本身的中文乱码,远程抓取输出的中文输出正常,继续检查脚本的编码,发现使用了ANSI的编码,修改为UTF-8编码后再执行,终于没问题了,正常输出如下:
[root@xj123 ip]# ./ip.sh IP地址 国家 运营商 区域 省份 城市 县/区 ====================================================================== 114.216.229.147 中国 电信 华东 江苏省 苏州市 常熟市 |
实例演示(分析最近暴力破解服务器密码的IP归属地),顺便吐槽下,为毛这么多天朝的ip:
cat /var/log/secure | awk '/Failed/ {print $(NF-3)}' | sort -u > list && ./ip.sh |
[root@xj123 ip]# ./ip.sh IP地址 国家 运营商 区域 省份 城市 县/区 ====================================================================== 1.93.30.197 中国 鹏博士 华北 北京市 北京市 116.10.191.170 中国 电信 华南 广西壮族自治区 南宁市 122.226.95.219 中国 电信 华东 浙江省 金华市 123.131.134.18 中国 联通 华东 山东省 临沂市 123.199.130.91 中国 城市网络 华北 北京市 北京市 148.243.138.109 墨西哥 161.53.212.119 克罗地亚 162.13.89.226 英国 180.96.63.124 中国 电信 华东 江苏省 南京市 183.56.129.146 中国 电信 华南 广东省 潮州市 188.143.232.103 俄罗斯 198.100.147.60 加拿大 200.75.141.74 委内瑞拉 211.154.20.42 中国 华北 北京市 北京市 218.55.64.202 韩国 60.173.26.134 中国 电信 华东 安徽省 铜陵市 61.147.103.152 中国 电信 华东 江苏省 扬州市 61.147.103.162 中国 电信 华东 江苏省 扬州市 61.147.107.117 中国 电信 华东 江苏省 扬州市 61.172.238.226 中国 电信 华东 上海市 上海市 青浦区 61.174.50.163 中国 电信 华东 浙江省 湖州市 61.36.11.69 韩国 61.60.10.77 台湾 台湾省 82.112.1.38 俄罗斯 82.221.102.185 冰岛 |
沙发,好久没来了
路过
正好用上,甚好,淘宝竟然有这接口好方便
楼主解析有点慢啊 两三秒才解析出一条
允许脚本之后归属地没变