1、【实操】使用python脚本自动检测域名信息是否准确

背景:

  因为信息安全的原因,内外网表格数据等信息不能互传,因而内外网信息表同步频率比较低,导致部分信息存在偏差。

  比如域名、公网地址、内网地址等在更改后,信息没有及时同步,或者更新信息的人因为手工上传导致错误,没有及时发现,倒置后期排查问题时不能及时拿到准确信息,需要沿网络TOP逐级排查,而不是直接准确查找关键节点,这会大大降低解决问题的效率;

 

tips

  在本样例脚本中,所有数据与代码都经过了脱敏处理,如需使用请根据自身需求修改或扩展代码。代码在公网环境运行,不通私网的环境如有内部NDS服务器也可以进行修改使用。

 

本例代码逻辑(功能):

  通过获取表格或其他数据源提供的域名,对每个域名进行实时解析,将实时解析的公网地址与记录的公网地址进行对比;代码会将域名解析成功与否,对比结果等信息通过不同的字体与背景颜色组合打印出来;

 

代码如下:

  注: 两种方式都可以使用 ctrl + c 终断程序

可打包成exe文件的方式(请自行查阅pyinstaller等打包工具用法)


import socket
import xlrd
import re
import keyboard


# 解析域名的公网地址
def get_public_ip(domain):
    try:
        return socket.gethostbyname(domain)
    except socket.gaierror:
        return None


def read_domain_from_excel(filename):
    domain_pattern = re.compile('([a-zA-Z0-9]+.level3.leve2.top)')  # 域名主机名通过模糊匹配,其他相同级域名可以直接写明,以此从信息源读取域名
    xl = xlrd.open_workbook(filename)
    sheet = xl.sheet_by_index(0)
    rows = sheet.nrows
    print("\n\033[1m域名\033[22m".ljust(40),"\t","\033[1m记录校验\033[22m".ljust(25),"\033[1m解析结果\033[22m".ljust(30),"\t","\033[1m记录地址\033[22m","\n")
    # 表格中域名和地址的读取逻辑可自行修改
    for i in range(1,rows):
        domain_str = sheet.cell(i,3).value
        record_ip = sheet.cell(i,5).value.replace('\n',' ')
        if domain_str:  # 确保域名不是空值
            domains = re.findall(domain_pattern,domain_str.strip())
            for domain in domains:
                domain = domain.strip()
                if domain:
                    public_ip = get_public_ip(domain)
                    if public_ip:
                        if re.search(public_ip,record_ip):
                            print(f"\033[40m\033[37m{domain}\033[0m".ljust(40),"\033[40m\033[32m正确\033[0m".ljust(25),f"\033[40m\033[32m{public_ip}\033[0m".ljust(30),f"\033[40m\033[37m{record_ip.strip()}\033[0m")
                        else:
                            print(f"\033[40m\033[37m{domain}\033[0m".ljust(40),"\033[40m\033[31m错误\033[0m".ljust(25), f"\033[40m\033[31m{public_ip}\033[0m".ljust(30), f"\033[40m\033[37m{record_ip.strip()}\033[0m")
                    else:
                        print(f"\033[40m\033[31m{domain}\033[0m".ljust(40),"\033[40m\033[37m错误\033[0m".ljust(25),f"\033[40m\033[37m无法解析\033[0m".ljust(30), f"\033[40m\033[37m{record_ip.strip()}\033[0m")


if __name__ == '__main__':
    while True:
        print("\033[1m=\033[22m"*22)
        name = input("··请输入Excel文件名:  example.xlsx\n>>>")
        if not '.xlsx' in name:
            print(f"{name} 不是xlsx文件!请检查文件名是否正确。")
            continue
        file = r'.\{}'.format(name)
        try:
            read_domain_from_excel(file)
        except FileNotFoundError:
            print(f"{file} 不存在!请检查文件名是否正确。")
            continue
        except IOError:
            print(f"无法打开文件: {file}")
            continue
        except KeyboardInterrupt:
            print("程序被中断.")
            break
        except Exception as e:
            print(f"在读取Excel文件时发生未知错误: \n{e}")
            continue

使用命令行传参--修改如下45行代码改为46行即可

 # 命令行传参格式: python script.py filename.xlsx
import sys
import socket
import xlrd
import re
import keyboard


# 解析域名的公网地址
def get_public_ip(domain):
    try:
        return socket.gethostbyname(domain)
    except socket.gaierror:
        return None


def read_domain_from_excel(filename):
    domain_pattern = re.compile('([a-zA-Z0-9]+.level3.leve2.top)')  # 域名主机名通过模糊匹配,其他相同级域名可以直接写明,以此从信息源读取域名
    xl = xlrd.open_workbook(filename)
    sheet = xl.sheet_by_index(0)
    rows = sheet.nrows
    print("\n\033[1m域名\033[22m".ljust(40),"\t","\033[1m记录校验\033[22m".ljust(25),"\033[1m解析结果\033[22m".ljust(30),"\t","\033[1m记录地址\033[22m","\n")
    # 表格中域名和地址的读取逻辑可自行修改
    for i in range(1,rows):
        domain_str = sheet.cell(i,3).value
        record_ip = sheet.cell(i,5).value.replace('\n',' ')
        if domain_str:  # 确保域名不是空值
            domains = re.findall(domain_pattern,domain_str.strip())
            for domain in domains:
                domain = domain.strip()
                if domain:
                    public_ip = get_public_ip(domain)
                    if public_ip:
                        if re.search(public_ip,record_ip):
                            print(f"\033[40m\033[37m{domain}\033[0m".ljust(40),"\033[40m\033[32m正确\033[0m".ljust(25),f"\033[40m\033[32m{public_ip}\033[0m".ljust(30),f"\033[40m\033[37m{record_ip.strip()}\033[0m")
                        else:
                            print(f"\033[40m\033[37m{domain}\033[0m".ljust(40),"\033[40m\033[31m错误\033[0m".ljust(25), f"\033[40m\033[31m{public_ip}\033[0m".ljust(30), f"\033[40m\033[37m{record_ip.strip()}\033[0m")
                    else:
                        print(f"\033[40m\033[31m{domain}\033[0m".ljust(40),"\033[40m\033[37m错误\033[0m".ljust(25),f"\033[40m\033[37m无法解析\033[0m".ljust(30), f"\033[40m\033[37m{record_ip.strip()}\033[0m")


if __name__ == '__main__':
    while True:
        print("\033[1m=\033[22m"*22)
        # name = input("··请输入Excel文件名:  example.xlsx\n>>>")
        name = sys.argv[1]
        if not '.xlsx' in name:
            print(f"{name} 不是xlsx文件!请检查文件名是否正确。")
            continue
        file = r'.\{}'.format(name)
        try:
            read_domain_from_excel(file)
        except FileNotFoundError:
            print(f"{file} 不存在!请检查文件名是否正确。")
            continue
        except IOError:
            print(f"无法打开文件: {file}")
            continue
        except KeyboardInterrupt:
            print("程序被中断.")
            break
        except Exception as e:
            print(f"在读取Excel文件时发生未知错误: \n{e}")
            continue

exe运行部分截图:

记录错误或不能解析的结果:

posted @ 2024-01-27 15:37  段愿仁长九  阅读(138)  评论(0)    收藏  举报