我正在使用dnspython获取“A”记录并返回结果(给定域的 IP 地址)。
我有这个简单的测试 python 脚本:
import dns.resolver
def resolveDNS():
domain = "google.com"
resolver = dns.resolver.Resolver();
answer = resolver.query(domain , "A")
return answer
resultDNS = resolveDNS()
print resultDNS
Run Code Online (Sandbox Code Playgroud)
但是,输出是:
<dns.resolver.Answer object at 0x0000000004F56C50>
Run Code Online (Sandbox Code Playgroud)
我需要将结果作为字符串。如果是字符串数组,如何返回?
我在 Ubuntu 22.10 下使用“pip install dnspython”安装了“dnspython”包,并制作了以下简短脚本:
#!/usr/bin/env python3
import dns.zone
import dns.query
zone = dns.zone.Zone("example.net")
dns.query.inbound_xfr("10.0.0.1", zone)
for (name, ttl, rdata) in zone.iterate_rdatas("SOA"):
serial_nr = rdata.serial
Run Code Online (Sandbox Code Playgroud)
当我使用 mypy(版本 0.990)检查此代码片段时,它会报告第error: Module has no attribute "inbound_xfr" [attr-defined]7 行。
根据mypy 文档,如果 Python 文件和存根文件都存在于搜索路径上的同一目录中,则仅使用存根文件。对于“dnspython”,存根文件query.pyi存在于dns包中,并且存根文件确实没有属性“inbound_xfr”。当我重命名或删除存根文件时,将query.py使用 Python 文件而不是存根文件,并且 mypy 不再抱怨缺少属性。
我猜这是一个“dnspython”错误?有没有办法告诉 mypy 对于query模块,应该忽略存根文件?
我需要在每个查询中获取DNS记录的原始TTL。DNS解析器仅在第一次查询时显示原始ttl。它显示了在每个下一个查询上重置缓存的时间。
>>> answer = dns.resolver.query('www.stackoverflow.com')
>>> print answer.rrset.ttl
300
>>> answer = dns.resolver.query('www.stackoverflow.com')
>>> print answer.rrset.ttl
292
Run Code Online (Sandbox Code Playgroud)
如何在任何查询中获取原始TTL?
假设我想使用 dnspython 为 Alexa 前 100 万站点发送各种类型的 DNS 查询(A、AAAA、NS、SOA、DNSKEY、NSEC3、DS 等)。
一项一项地执行此操作会花费一点时间,因为我要为每个站点发送多个查询。所以我希望在 python 3 中使用 asyncio 执行一些并行操作。
我经历了大卫的生成器/协程三部曲,http://www.dabeaz.com/talks.html,但我仍然不确定如何完成我的简单任务......
进一步来说,
results = dns.resolver.query('google.com','AAAA')
Run Code Online (Sandbox Code Playgroud)
是一个阻塞函数调用,等待 DNS 回复返回。
如何在这段等待时间内发送其他查询而不使用线程?由于 DNS 查询通常是 udp 数据包,因此我认为 asyncio 可能会有所帮助。
pycares 似乎不支持我需要的所有记录类型,因此 pycares 和 aiodns 不适用于我的情况。
任何参考和想法都会有所帮助。
我正在尝试dnspython使用import dnspython.
pip3 freeze 显示该软件包已安装,但我不断收到错误消息 ModuleNotFoundError: No module named 'dnspython'
我试过了:
pip3 install dnspythonpip3 install git+https://github.com/rthalley/dnspythonsudo python setup.py installpip3 install dnspython3并import dnspython3在脚本中使用我知道这篇关于 python 2.7 的帖子,但没有一个解决方案有效。
当我使用dnspython查询权威名称服务器的NS记录时,它会引发NoAnswer异常,尽管我的数据包捕获表明收到了正确的响应.
示例:请求j.gtld-servers.net(192.48.79.30)获取stackoverflow.com的NS记录
>>> import dns.resolver
>>> r = dns.resolver.Resolver()
>>> r.nameservers = ['192.48.79.30']
>>> for answer in r.query('stackoverflow.com', 'NS'):
... print answer.to_text()
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/dns/resolver.py", line 905, in query
raise_on_no_answer)
File "/usr/local/lib/python2.7/dist-packages/dns/resolver.py", line 142, in __init__
raise NoAnswer
dns.resolver.NoAnswer
>>>
Run Code Online (Sandbox Code Playgroud)
Wireshark显示答案确实回来了:
Frame 2: 157 bytes on wire (1256 bits), 157 bytes captured (1256 bits)
Ethernet II, Src: xxxxxxxxxxxxxx (xx:xx:xx:xx:xx:xx), Dst: xxxxxxxxxxxxx (xx:xx:xx:xx:xx:xx)
Internet Protocol Version 4, Src: 192.48.79.30 (192.48.79.30), …Run Code Online (Sandbox Code Playgroud) 我要更改域的默认名称服务器,然后获取其 A 记录!我尝试使用以下代码,但问题是,当我使用 IP 地址作为名称服务器时,一切正常,但当我使用名称服务器名称(例如“ns1.google.com”)时,我无法运行代码并出现异常。有什么想法吗?(我使用了这里的代码:使用 dns.resolver (pythondns) 设置特定的 DNS 服务器)
def NsLookupSpecificNS(domain):
my_resolver = dns.resolver.Resolver()
# 8.8.8.8 is Google's public DNS server
my_resolver.nameservers = ['216.239.38.10']
answer = my_resolver.query('google.com', 'A')
try:
for rdata in answer:
print rdata
except dns.resolver.NoAnswer:
pass
Run Code Online (Sandbox Code Playgroud)
我已经厌倦了以下内容:
def NsLookupSpecificNS(domain):
my_resolver = dns.resolver.Resolver()
# 8.8.8.8 is Google's public DNS server
my_resolver.nameservers = ['ns1.google.com']
answer = my_resolver.query('google.com', 'A')
try:
for rdata in answer:
print rdata
except dns.resolver.NoAnswer:
pass
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
Traceback (most recent call last):
File "C:\Users\My Documents\LiClipse …Run Code Online (Sandbox Code Playgroud) 我使用dnspython查询 DNS 服务器以将域名解析为其 IP。
当我尝试解析“google.co.uk”时,我只得到一个 IP。然而,使用另一个解析器工具我得到另一个IP。两个IP都是正确的,我通过将IP放在浏览器中来测试它们,都打开“google.co.uk”。
显然,为我正在测试的域名分配了多个IP。有什么方法可以在 dnspython 中使用来检索给定域名的所有 IP 吗?
这是我的简单脚本:
import dns.resolver
def resolve(domain):
resolveList = []
resolver = dns.resolver.Resolver(); #create a new instance named Resolver
answer = resolver.query(domain,"A");
y=0
for rData in answer:
resolveList.append(rData)
++y
return resolveList
domainName = "google.co.uk"
queryResult = resolve(domainName);
for result in queryResult:
print queryResult[0]
Run Code Online (Sandbox Code Playgroud) dnspython ×8
python ×7
dns ×6
coroutine ×1
domain-name ×1
mypy ×1
python-2.7 ×1
python-3.6 ×1
sockets ×1
ttl ×1