脚本架构:
- domain_test.py:批量解析运行主程序
- DomainResult.txt:域名解析结果文件
- domains.txt:解析的域名文件
实现代码如下:
# coding:utf-8 import socket import subprocess import re def get_host_from_file(file_path): with open(file_path, \'r\') as fr: domains = fr.readlines() result = [] for url in domains: url = url.strip() try: ips = socket.gethostbyname_ex(url)[-1] result.append(url + \'\\t\' + \';\'.join(ips) + \'\\t\' + \'ping\' + \'\\n\') except Exception as e: print(url, e) with open(\'./domain2ip.txt\', \'w\') as fw: fw.writelines(result) def get_host_from_url(url): try: ips = socket.gethostbyname_ex(url)[-1] return url + \'\\t\' + \';\'.join(ips) + \'\\t\' + \'ping\' + \'\\n\' except Exception as e: print(url, e) return url + \'\\t\' + \'none\' + \'\\n\' def dig_test(file_name, dns_name): dig_command = \'dig \' ip_result = [] if dns_name: dig_command += dns_name + \' \' with open(file_name) as fr: domains = fr.readlines() for ui, full_url in enumerate(domains): ips = [] full_url = full_url.strip() try: result = subprocess.Popen(dig_command + full_url, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) except Exception as e: print(full_url, e) else: results = str(result.stdout.read()).split(\'\\\\n\') for temp in results: if full_url in temp and \'IN\' in temp: ip = re.match(r\'.*\\\\t([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}).*\', temp) if ip and ip.group(1) not in ips: ips.append(ip.group(1)) if \'AUTHORITY SECTION\' in temp: break if ips: temp = full_url + \'\\t\' + \';\'.join(ips) + \'\\t\' + \'dig\' + \'\\n\' else: temp = get_host_from_url(full_url) print(ui, temp) ip_result.append(temp) #解析完成后,生成结果文件 with open(\'domains.txt\', \'w\') as fw: fw.writelines(ip_result) if __name__ == \'__main__\': # 先使用dig,失败时使用ping获取域名ip,可指定dns,如@114.114.114.114 dig_test(file_name=\'DomainResults.txt\', dns_name=\'\')
演示结果:
© 版权声明
THE END
暂无评论内容