如何用Python依据域名CNAME/NS记录执行操作及排查代码问题
解决CNAME检测问题与实现域名记录检测脚本
一、修复CNAME检测代码的问题
你的代码始终输出“No”,核心原因是server.target是dns.name.Name类型的对象,不是普通字符串,直接和字符串'xdomain.org'比较会不相等。另外,DNS返回的目标域名通常末尾带有.(比如xdomain.org.),需要处理后再比较。
修正后的代码(包含异常处理,避免无CNAME记录时崩溃):
import dns.resolver domain = 'example.com' try: answers = dns.resolver.resolve(domain, 'CNAME') for server in answers: # 转换为字符串并去掉末尾的点号 target = server.target.to_text().rstrip('.') print(target) if target == 'xdomain.org': print("Yes") else: print("No") except dns.resolver.NoAnswer: print("该域名没有CNAME记录") except dns.resolver.NXDOMAIN: print("域名不存在")
二、完整实现域名记录检测脚本
以下脚本可以同时检测CNAME指向和NS记录,并执行对应操作:
import dns.resolver # 自定义配置 CHECK_DOMAIN = 'example.com' TARGET_CNAME = 'xdomain.org' # 要检测的CNAME目标 TARGET_NS = {'ns1.xserver.com', 'ns2.xserver.com'} # 要检测的NS服务器集合 def execute_y(): """替换成你的Y操作逻辑""" print("执行Y操作:域名CNAME指向符合要求") def execute_z(): """替换成你的Z操作逻辑""" print("执行Z操作:域名NS服务器符合要求") # 检测CNAME记录 try: cname_records = dns.resolver.resolve(CHECK_DOMAIN, 'CNAME') for record in cname_records: target = record.target.to_text().rstrip('.') if target == TARGET_CNAME: execute_y() break # 找到匹配项后停止遍历 except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN): # 无CNAME记录或域名不存在时跳过 pass # 检测NS记录 try: ns_records = dns.resolver.resolve(CHECK_DOMAIN, 'NS') current_ns_set = {record.target.to_text().rstrip('.') for record in ns_records} # 判断目标NS是否全部存在于当前域名的NS列表中 if TARGET_NS.issubset(current_ns_set): execute_z() except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN): print("无法获取NS记录或域名不存在")
关键说明
- 用集合存储目标NS,通过
issubset方法可以快速判断是否所有指定的NS服务器都在域名的NS记录中 - 所有DNS记录的目标都转换为字符串并去掉末尾的点号,避免因格式差异导致比较失败
- 加入异常处理,防止脚本因域名不存在、无对应记录等情况崩溃
内容的提问来源于stack exchange,提问作者Reception123
相关产品推荐
相关产品推荐

