背景:
因为信息安全的原因,内外网表格数据等信息不能互传,因而内外网信息表同步频率比较低,导致部分信息存在偏差。
比如域名、公网地址、内网地址等在更改后,信息没有及时同步,或者更新信息的人因为手工上传导致错误,没有及时发现,倒置后期排查问题时不能及时拿到准确信息,需要沿网络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