我有以下脚本,它不适合我:(。我本质上想要创建10个线程来端口扫描100个端口的范围。它应该看起来很简单,但我不知道我哪里出错。我是新手python并且一直在研究如何让这个工作过去两周,我知道放弃。执行时它什么都不做。请帮助:)。
编辑:更新了代码,但在运行时它现在没有。 #Import Modules 来自scapy.all import * 从队列导入队列 来自线程导入线程
#Set Variables
threadCount = 10
destIP = "192.168.136.131"
portLength = 100
q = Queue(maxsize=0)
#Empty Arrays
openPorts = []
closedPorts = []
threads = []
def qProcessor(q):
while True:
try:
print q.get()
#getQ = q.get()
#getQ()
#if getQ() is None:
# break
#else:
q.task_done()
except Exception as e:
print 'error in qprocessor function'
print e
def portScan(port, dstIP):
scan = sr1(IP(dst=dstIP)/TCP(dport=port,flags="S"), verbose=0)
if scan.getlayer(TCP).flags == 0x12:
openPorts.append("IP: %s \t Port: %s"%(scan.getlayer(IP).src, scan.getlayer(TCP).sport))
sr1(IP(dst=dstIP)/TCP(dport=port,flags="R"),verbose=0)
if scan.getlayer(TCP).flags == 0x14:
closedPorts.append("IP: %s \t Port: %s"%(scan.getlayer(IP).src, scan.getlayer(TCP).sport))
def main():
try:
for i in range(threadCount):
worker = Thread(target=qProcessor, args =(q,))
worker.setDaemon(True)
worker.start()
except Exception as e:
print "error in worker section"
print e
for p in range(portLength):
q.put(portScan(p, destIP))
q.join()
if __name__ == '__main__':
main()
for port in openPorts:
print port
所以我找到了答案。这让我死了两个星期,最后我用pdb模块和' -v'来调试应用程序。开关。我从这个练习中学到了很多东西,想在这个哈哈之后杀死python。但是使用stackoverflow的一些小提示来解决这个问题非常棒。这是最后的脚本。我已经评论了在我解决问题的过程中给我带来问题的那条线。顺便说一下,没有线程就可以正常工作。
#Import Modules
from scapy.all import *
from Queue import Queue
from threading import Thread
#Set Variables
threadCount = 10
destIP = "192.168.136.131"
portLength = 100
q = Queue(maxsize=0)
#Empty Arrays
openPorts = []
closedPorts = []
threads = []
def main():
try:
for i in range(threadCount):
worker = Thread(target=qProcessor, args =(q,))
worker.setDaemon(True)
worker.start()
except Exception as e:
print "error in worker section"
print e
for p in range(portLength):
q.put(portScan(p, destIP))
q.join()
def qProcessor(q):
while True:
try:
q.get()
q.task_done()
except Exception as e:
print 'error in qprocessor function'
print e
def portScan(port, dstIP):
scan = sr1(IP(dst=dstIP)/TCP(dport=port,flags="S"), verbose=0)
if scan.getlayer(TCP).flags == 0x12:
openPorts.append("IP: %s \t Port: %s"%(scan.getlayer(IP).src, scan.getlayer(TCP).sport))
# sr1(IP(dst=dstIP)/TCP(dport=port,flags="R"),verbose=0)
if scan.getlayer(TCP).flags == 0x14:
closedPorts.append("IP: %s \t Port: %s"%(scan.getlayer(IP).src, scan.getlayer(TCP).sport))
else:
pass
if __name__ == '__main__':
main()
for port in openPorts:
print port
答案 0 :(得分:0)
您确定要将对象Scan
传递给您的主题,而不是portScan
吗?
不熟悉scapy
模块的全部内容,它被认为是不好的形式
from scapy.all import *
特别是如果你只需要一个或两个类/函数。这将导致命名空间污染。同样的事情适用于你只需要Thread的threading
。
无论如何,我很惊讶python翻译没有提出错误,因为我没有看到scapy API中列出的Scan
(这就是我发表评论的原因)没有做from moduleX import *
- 其他人可能需要跟踪Scan
的来源。看看当您通过自定义函数portScan
时会发生什么。
答案 1 :(得分:0)
我可以给你一些建议。 第一个实际上是你不应该使用python进行端口扫描。在大多数官方Linux存储库中,有一个名为NMap的专业人员制作的工具。通过使用此工具,您可以轻松解决问题。
如果您仍然期待编写自己的代码,另一个建议是如何使用线程。您可以使用多线程回调方案。回调是一个函数,每个线程在线程之间的分配完成后应该调用它。
例如:您可以将所有对(端口,回调)放入队列,然后通过另一个名为worker的函数将该对从队列中弹出并调用while True:callback(port)。
最重要的部分是创造工人。它是这样的:
for i in threads_num:
t = threading.Thread(target=worker)
t.setDaemon(True)
t.start()
祝你好运!
答案 2 :(得分:0)
上面的回答。问题在于重置数据包阻止了脚本。