首页 > 编程语言 >1、【实操】使用python脚本自动检测域名信息是否准确

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

时间:2024-01-27 15:44:45浏览次数:37  
标签:domain python 自动检测 40m 实操 ip 033 ljust 0m

背景:

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

  比如域名、公网地址、内网地址等在更改后,信息没有及时同步,或者更新信息的人因为手工上传导致错误,没有及时发现,倒置后期排查问题时不能及时拿到准确信息,需要沿网络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运行部分截图:

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

标签:domain,python,自动检测,40m,实操,ip,033,ljust,0m
From: https://www.cnblogs.com/gaogaoing/p/17991490

相关文章

  • python 多线程运行 串行或并行
    我们知道在python中运行多线程程序很简单,只需要几步,创建线程,start线程即可,下面简单说下多线程的串行或者并行的使用示例:#-*-coding:utf-8-*-#@Time:2024-01-2714:03importthreadingimporttimedefrun(name:str)->None:time.sleep(3)print("Thre......
  • Python手相识别教程15指纹(斗和簸箕)
    15指纹指纹图案在胎儿发育的前18周内形成,并在人的一生中保持不变。每个人的指纹都是独一无二的,但可分为三种基本模式:环状(斗)、弓状(属于箕)和轮状(属于箕)。这些图案是个性特征的标志。俗语:“一斗穷,二斗富,三斗四斗卖豆腐,五斗六斗开当铺,七斗八斗坐着走,九斗十斗享清福。”实际不太准确!......
  • 在 Python 的 `glob` 模块中,文件名的大小写敏感性取决于你的操作系统。在 Unix 和 Lin
    在Python的`glob`模块中,文件名的大小写敏感性取决于你的操作系统。在Unix和Linux系统中,`glob`是区分大小写的。然而,在Windows和MacOS中,`glob`是不区分大小写的。例如,如果你在Unix或Linux系统中运行以下代码:```pythonimportglobfiles=glob.glob('*.xlsx')......
  • python第三节:Str字符串类型(9)
    str.swapcase()返回原字符串的副本,其中大写字符转换为小写,小写转换为大写。注意:s.swapcase().swapcase()==s 并不一定为真值。例子:arg2='spaciousworldUKUS'arg3='你好spaciousworldUKUS'arg4='你好#¥56helloWORLd'print(arg2.swapcase())print(arg3.swap......
  • 快乐学Python,DataFrame的基本操作
    在上一篇文章中,我们了解了如何使用pandas的函数来从多种数据源:csv、excel和html网页。其中不管是哪一种数据读取的方式,最终返回的都是一个DataFrame对象。对于DataFrame对象,我们只是简单将其打印出来,这一篇我们来学习围绕DataFrame的基本操作(添加行、列,删除行、列,排序......
  • python 13
    1.集合(set)集合是一个无序,可变,不允许数据重复的容器。1.1定义v1={11,22,33,"alex"}无序,无法通过索引取值。可变,可以添加和删除元素。v1={11,22,33,44}v1.add(55)print(v1)#{33,11,44,22,55}不允许数据重复v1={11,22,33,44}v1.add(22)print(v1)#{33,......
  • python--pyQt 基础框架代码 pyside6
    importsysfromPySide6importQtWidgets,QtCore,QtGuifromPySide6.QtCoreimportQt,QRectfromPySide6.QtGuiimportQColor,QEnterEventfromPySide6.QtWidgetsimportQApplication,QDialog,QMainWindow,QGraphicsDropShadowEffectimportyiqi_uiclassMain......
  • Python模块和包
    目录Python模块和包Python模块概述模块搜索路径import语句import<module_name>from<module_name>import<name(s)>from<module_name>importas<alt_name>import<module_name>as<alt_name>dir()函数将模块作为脚本执行重新加载模块Python包包初始化从包不import*子包结......
  • Python_numpy-增加以及修改维度
    gradio组件输入组件-输出组件输入输出组件 多输入和多输出组件gr.State是一个不可见的组件,目的是在后台存储一些变量方便访问和交互BlockcomponentsTextbox:interactiveinteractive=TrueEventlistenerchange()e......
  • python之常用标准库-random
    1.randomdefrandom(self):"""Getthenextrandomnumberintherange[0.0,1.0)."""return(int.from_bytes(_urandom(7),'big')>>3)*RECIP_BPF翻译:获取0,1之间的随机浮点数1#!/usr/bin/python2importrandom3p......