DNS Resolver не содержит ответа - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь автоматизировать некоторые задачи с помощью python. Я должен chcek, если некоторые домены все еще находятся в наших DNS-серверах. Поэтому, просматривая стек, я нашел скрипт с помощью dns.resolver и попытался приспособить его к моим потребностям. Итак, скрипт выглядит так:

import socket
import dns.resolver


mylist=[]
with open('domainfile.txt') as file:
    for line in file:
        mylist.append(line)
length = len(mylist)


resolver = dns.resolver.Resolver()
resolver.nameservers=[socket.gethostbyname('dns.example.com')]

for i in range(length):
    for rdata in resolver.query(mylist[i], 'CNAME') :
        print(rdata.target)

My domainfile.txt выглядит так:

domain1
domain2
domain3
[...]

И сообщение об ошибке, которое я получил, выглядит так:

Traceback (последний вызов был последним): файл "dns python .py", строка 20, для rdata в resolver.query (lista [i], 'CNAME'): файл "/ usr / local / lib / python3 .7 / dist-packages / dns / resolver.py ", строка 1053, в запросе lift_on_no_answer) Файл" /usr/local/lib/python3.7/dist-packages/dns/resolver.py ", строка 236 , в init повысить NoAnswer (response = response) dns.resolver.NoAnswer: DNS-ответ не содержит ответа на вопрос: domain1 \ 010.example.com. IN CNAME

Если я просто вставлю свой домен в , если утверждение вместо итерации по mylist , я получу то, что мне нужно. Но когда я пытаюсь сделать это через список, он добавляет к моему домену \ 010 , и тогда ничего не происходит. Можете ли вы помочь мне с этим? Спасибо!

1 Ответ

1 голос
/ 27 января 2020

Это кажется ожидаемым согласно документам: http://www.dnspython.org/docs/1.14.0/dns.resolver.Resolver-class.html#query

Повышения:

...

  • НетОтвет - в ответе не было ответа, а в поле_подключения установлено значение Истина.

Причина, по которой это происходит, возможно, заключается в том, что вы не удалили окончания строк в своих доменах.


Вот как я это сделаю.

import socket
import dns.resolver


with open('domainlist.txt') as f:
    my_list = [line.strip() for line in f.readlines()]

resolver = dns.resolver.Resolver()
resolver.nameservers=[socket.gethostbyname('dns.example.com')]

for domain in my_list:
    try:
        q = resolver.query(domain, 'CNAME')
        for rdata in q:
            print(f'{domain}: {rdata.target}')
    except dns.resolver.NoAnswer:
        print(f'{domain}: No answer')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...