我目前正试图找到一种方法来检查名称服务器是否可以响应TCP或UDP数据包
我的想法是,从一个网站(例如google.com)获取所有名称服务器,将它们存储在一个列表中,然后尝试向所有服务器发送TCP和UDP消息
虽然我得到了名称服务器,但当我试图对udp进行查询时(检查代码上的udpPacket
),我的解释器显示出一个问题,它说:
"TypeError: coercing to Unicode: need string or buffer, NS found"
我是Python新手(来自C和C++),我猜这只是不兼容的类型
我检查了dnspython
的文档,找不到NS是什么类型的(可能它本身就是一个类型),也找不到为什么它不能作为参数传递
你认为问题是什么?有没有更好的办法来解决这类问题
def getNSResults(url):
#create an empty list where we can store all the nameservers we found
nameServers = []
nameServers = dns.resolver.query(url,dns.rdatatype.NS, raise_on_no_answer=False)
#create a dictionary where based on all the nameservers.
#1st label refers to the ns name of our url that we inserted.
#2nd label shows wether or not we received a UDP response or not.
#3rd label shows wether or not we received a TCP response or not.
results = {}
for nameServer in nameServers:
#make a dns ns query, acts as a dumb message since whatever we send we just care of what we get back
query = dns.message.make_query(dns.name.from_text(url), dns.rdatatype.ANY)
query.flags |= dns.flags.AD
query.find_rrset(query.additional, dns.name.root, 65535, dns.rdatatype.OPT, create=True, force_unique=True)
#try sending a udp packet to see if it's listening on UDP
udpPacket = dns.query.udp(query,nameServer)
#try sending a tcp packet to see if it's listening on TCP
tcpPacket = dns.query.tcp(None,nameServer)
#add the results in a dictionary and return it, to be checked later by the user.
results.update({"nsName" == nameServer, "receivedUDPPacket" == isNotNone(udpPacket),"receivedTCPPacket" == isNotNone(tcpPacket)})
提前谢谢
查看您的代码,我看到一些DNS问题、一些Python问题和一些dnspython问题。让我们看看我们能不能一起学点东西
域名系统
首先,函数
getNSResults
的参数称为url
。当您发送DNS查询时,您需要查询一个域名。URL是完全不同的(例如https://example.com/index.html
)。我会将url
重命名为类似domain_name
、domain
或name
的名称。有关URL和域名之间差异的更多信息,请参见https://www.copahost.com/blog/domain-vs-url/第二,让我们谈谈你想做什么
这听起来是个不错的方法。我想你可能遗漏了一些细节。因此,让我解释一下您可以采取的步骤:
dig +short NS google.com
,将获得以下输出:Python
在大多数情况下,您的Python语法是正确的。 我看到的最大的危险是以下代码:
让我们把它分解一下。 首先,您有
results
,这是一个dict
。 那么你有这个:这是{}的{}。
我想你的意思是这样的:
Python中的函数和变量名称通常用小写字母书写,单词之间用下划线分隔(例如
my_variable
,def my_function()
)。类名通常是大写的(例如class MyClass
)。 这一切都不是必需的,你可以随意命名你的东西,很多超级流行的库和内置程序打破了这个惯例,我想我会把它扔出去,因为它在阅读Python代码时会很有帮助dnspython
当您不确定事物的类型或属性时,请记住这四个朋友,都是Python内置的: 1.
pdb
2.dir
3.type
4.print
pdb
是一个Python调试器。只要import pdb
,把pdb.set_trace()
放在你想打破的地方。您的代码将停止在那里,然后您可以检查所有变量的值dir
将返回您传递给它的任何内容的属性和方法。例如:print(dir(udpPacket))
type
将返回对象的类型print
正如您可能已经知道的,将打印出内容,以便您可以查看我将把这部分留给你测试。 如果你不知道它是什么,就对所有东西运行
dir()
。 我还应该提到help()
,它对于内置内容非常有用本节的总结是,有时文档并不全在那里,或者很难找到,尤其是当您刚接触一种语言/库/任何东西时。 所以你必须自己解决问题,这意味着使用我刚才提到的所有工具,看看源代码,诸如此类的东西
总结
我希望这是有帮助的。我知道这是很多,可能太多了,但要有耐心,要知道DNS和Python是一些非常有用和有趣的东西
我继续写了一些东西,这是我认为你们希望实现的目标的开始。 我建议你从头到尾走一遍,确保你明白发生了什么。 如果你不懂一些东西,记得
pdb
和dir
(还有谷歌,等等)我再次希望这是有帮助的。当我不知道你脑子里到底在想什么的时候很难,但这就是我为你准备的
相关问题 更多 >
编程相关推荐