【问题标题】:Match Domains to DNS Resolver Name - Python将域与 DNS 解析器名称匹配 - Python
【发布时间】:2020-12-06 18:08:19
【问题描述】:

我还是 Python 的新手,并且一直致力于此工作,以及一些与它相关的辅助项目,用于自动化我的 Plex 媒体管理任务。

我正在尝试编写一个 python 脚本,它允许我从 csv 文件中获取一组域列表,将它们与它们的 dns 名称匹配:示例(使用“NS”的 Plex.tv 将返回 jeremy.ns.cloudflare .com)

我的主要目标是从 csv 中读取域列表

运行我的代码以将这些域与 dns 解析器名称匹配

将它们写入一个新的 CSV 文件,然后将两者压缩在一起,这就是我的代码中的内容。

在此过程中我遇到了一些问题。

  1. Visual Code 不允许导入 dns.resolver(不是一个大问题,但如果您知道解决方法,我就不必从命令行运行它)
  2. 将域与其 DNS 解析器匹配会引发错误“AttributeError: 'list' object has no attribute 'is_absolute'”
import csv
import socket
import dns.resolver
import os
from os.path import dirname, abspath

# Setting Variables
current_path = dirname(abspath(__file__))
domainFName = '{0}/domains.csv'.format(current_path)
outputFile = '{0}/output.csv'.format(current_path)
dnsList = '{0}/list2.csv'.format(current_path)
case_list = []
fields = ['Domains', 'DNS Resolvers']
caseList = []
dnsResolve = []

# Read in all domains from csv into list
with open(domainFName, 'r') as file:
    for line in csv.reader(file):
        case_list.append(line)

print(case_list)

# Match domains to the DNS Resolver Name
for domains in case_list:
    answer = dns.resolver.resolve(domains, 'NS')
    server = answer.target
    dnsResolve.append(server)

# Write the dns Resolver names into a new csv file
with open(dnsList,'w', newline="") as r:
    writers = csv.writer(r)
    writers.writerows(caseList)      

# Write the domains and dns resolvers to new output csv
with open(outputFile,'w', newline="") as f:
    writer = csv.writer(f)
    writer.writerow(fields)
    writer.writerow(zip(case_list,caseList))

exit()

感谢您的帮助

【问题讨论】:

    标签: python csv dns dnspy


    【解决方案1】:

    在与同事讨论后,我能够解决我的问题,为了解决这个问题,如果有人想将此代码用于类似的需求(我们将其用于 DMARC),我将发布整个代码:

    import dns.resolver 
    import csv
    import os
    from os.path import dirname, abspath
    
    
    # Setting Variables
    current_path = dirname(abspath(__file__))
    domainFName = '{0}/domains.csv'.format(current_path)
    outputFile = '{0}/output.csv'.format(current_path)
    dnsList = '{0}/dnslist.csv'.format(current_path)
    backupCSV = '{0}/backup-output.csv'.format(current_path)
    case_list = []
    dns_list = []
    fields = ['Domains', 'DNS Resolvers']
    csv_output = zip(case_list, dns_list)
    domainAmount = 0
    rd = 00
    dnresolve = 00
    part = 0
    percentL = []
    percents = [10,20,30,40,50,60,70,80,90,95,96,97,98,99]
    percentList = []
    floatingList = []
    floatPart = []
    x = 00
    keyAzure = 'azure'
    keyCSC = 'csc'
     
    
    while x < .99:
        x += .01
        floatingList.append(x)
    
    # THIS IS THE CODE FOR WRITING CSV FILES INTO LISTS - LABELED AS #1
    print("FILES MUST BE CSV, WILL RETURN AN ERROR IF NOT. LEAVE OFF .CSV")
    
    # Here we will gather the input of which csv file to use. If none are entered, it will use domains.csv
    print("Enter your output file name (if blank will use default):")
    UserFile = str(input("Enter your filename: ") or "domains")
    fullFile = UserFile + '.csv'
    domainFName = fullFile.format(current_path)
    # Here will will specify the output file name. If the file is not created, it will create it
    # If the user enters not data, the default will be used, output.csv
    print("Enter your output file name (if blank will use default):")
    UserOutput = str(input("Enter your filename: ") or "output")
    fullOutput = UserOutput + '.csv'
    outputFIle = fullOutput.format(current_path)
    
    
    # Read in all domains from csv into list
    with open(domainFName, 'r') as file:
        for line in csv.reader(file):
            case_list.append(line)
            domainAmount += 1
            
    print("Starting the resolver:")
    print("You have " + str(domainAmount) + " Domains to resolve:")
    # THIS IS THE END OF THE CODE FOR WRITING CSV FILES INTO LISTS - LABELED AS #1
    
    # THE CODE BELOW IS WORKING FOR FINDING THE DNS RESOLVERS - LABELED AS #2
    # Function for matching domains to DNS resolvers
    def dnsResolver (domain):
        try:
            answers = dns.resolver.resolve(domain, 'NS')
            for server in answers:
                dns_list.append(server.target)   
        except:
            dns_list.append("Did Not Resolve")  
           
    print("Now resolving domains to their DNS name:")
    print("This will take a few minutes. Check out the progress bar for your status:")
    print("I have resolved 0% Domains:")
    
    # This code is for finding the percentages for the total amount of domains to find progress status
    def percentageFinder(percent, whole):
        return (percent * whole) / 100
    
    def percentGetter(part, whole):
        return (100 * int(part)/int(whole))   
    
    for x in percents:
        percentList.append(int(percentageFinder(x,domainAmount)))
        percentL = percentList
    #End code for percentage finding
    
    for firstdomain in case_list:
        for domain in firstdomain:
            dnsResolver(domain)
            if dnsResolver != "Did Not Resolve":
                rd += 1
            else:
                dnresolve += 1
            # Using w+ to overwrite all Domain Names & 
            with open(dnsList,'w+', newline="") as r:
                writers = csv.writer(r)
                writers.writerows(dns_list)
            # This is used for showing the percentage of the matching you have done
            part += 1
            if part in percentL:
                total = int(percentGetter(part, domainAmount))
                print("I Have Resolved {}".format(total) + "%" + " Domains:")
            else:
                pass
    
            
            
    print("Resolving has completed. Statistics Below:")
    print("------------------------------------------")
    
    
    
    print("You had " + str(rd) + " domains that resolved.")
    print("You had " + str(dnresolve) + " domains that did NOT resolve")
    
    
    
    # THIS IS THE END OF THE WORKING CODE - LABELED AS #2     
       
    # Write the dns Resolver names into a new csv file
    print("Now writing your domains & their DNS Name to an Output File:")
    
    with open(outputFile,'w+', newline="\n") as f:
        writer = csv.writer(f, dialect='excel')
        writer.writerow(fields)
        for row in csv_output:
            writer.writerow(row)
    
    
    print("Writing a backup CSV File")
    
    # Using this to create a backup in case to contain all domains, and all resolvers
    # If someone runs the script with a small list of domains, still want to keep a 
    # running list of everything in case any questions arise.
    # This is done by using 'a' instead of 'w' or 'w+' done above.
    with open(backupCSV,'w', newline="") as f:
        writer = csv.writer(f, dialect='excel')
        writer.writerow(fields)
        for row in csv_output:
            writer.writerow(row)
    print("Your backup is now done processing. Exiting program")
    
    # Sort the files by keyword, in this case the domain being azure or csc
    for r in dns_list:
        if keyAzure in r:
            for x in keyAzure:
                FileName = x
                print(FileName)
    
    exit()
    

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多