使用Python查询纯真IP

纯真IP挺全,IP数据库也是中文的,在日志分析等方面比较有用 。如果denyhosts日志、nginx和apache web访问日志分析等能用下,这里就结合一个网上找来的python脚本和QQ纯真IP库,解析日志里的IP归属 。

#!/usr/bin/env python
# coding: utf-8
'''用Python脚本查询纯真IP库
QQWry.Dat的格式如下:
+----------+
|  文件头  |  (8字节)
+----------+
|  记录区  | (不定长)
+----------+
|  索引区  | (大小由文件头决定)
+----------+
文件头:4字节开始索引偏移值+4字节结尾索引偏移值
记录区: 每条IP记录格式 ==> IP地址[国家信息][地区信息]
   对于国家记录,可以有三种表示方式:
       字符串形式(IP记录第5字节不等于0x01和0x02的情况),
       重定向模式1(第5字节为0x01),则接下来3字节为国家信息存储地的偏移值
       重定向模式(第5字节为0x02),
   对于地区记录,可以有两种表示方式: 字符串形式和重定向
   最后一条规则:重定向模式1的国家记录后不能跟地区记录
索引区: 每条索引记录格式 ==> 4字节起始IP地址 + 3字节指向IP记录的偏移值
   索引区的IP和它指向的记录区一条记录中的IP构成一个IP范围。查询信息是这个
   范围内IP的信息
'''
import sys
import socket
from struct import pack, unpack
class IPInfo(object):
    '''QQWry.Dat数据库查询功能集合
    '''
    def __init__(self, dbname):
        ''' 初始化类,读取数据库内容为一个字符串,
        通过开始8字节确定数据库的索引信息'''
        self.dbname = dbname
        # f = file(dbname, 'r')
        # Demon注:在Windows下用'r'会有问题,会把rn转换成n
        # 详见http://demon.tw/programming/python-open-mode.html
        # 还有Python文档中不提倡用file函数来打开文件,推荐用open
        f = open(dbname, 'rb')
        self.img = f.read()
        f.close()
        # QQWry.Dat文件的开始8字节是索引信息,前4字节是开始索引的偏移值,
        # 后4字节是结束索引的偏移值。
        # (self.firstIndex, self.lastIndex) = unpack('II', self.img[:8])
        # Demon注:unpack默认使用的endian是和机器有关的
        # Intel x86和AMD64(x86-64)是little-endian
        # Motorola 68000和PowerPC G5是big-endian
        # 而纯真数据库全部采用了little-endian字节序
        # 所以在某些big-endian的机器上原代码会出错
        (self.firstIndex, self.lastIndex) = unpack('

用法:

这里以denyhosts屏蔽的主机为例

#for i in `sed -e '/^ALL/!d' /etc/hosts.deny |cut -d' ' -f2`; do /root/QQwryIP.py $i;done
89.163.144.165 俄罗斯/
211.174.187.161 韩国/首尔
59.166.120.184 日本/ATHOME网络
147.231.70.91 捷克/
85.28.26.66 英国/伦敦大学皇家医学院皇家法医实验鉴定中心
218.239.223.77 韩国/
216.146.47.37 美国/加拿大/未知
69.31.5.120 美国/
75.109.170.56 美国/
69.43.142.150 美国/
59.109.6.83 北京市/方正宽带

使用Python查询纯真IP》有1条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注