Python中的线程 - 已经研究过,无法找到答案

时间:2014-09-02 07:26:54

标签: python multithreading port

我有以下脚本,它不适合我:(。我本质上想要创建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

3 个答案:

答案 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)

上面的回答。问题在于重置数据包阻止了脚本。