运行线程Nmap扫描后终端不显示输入

时间:2018-08-11 12:28:56

标签: python terminal python-multithreading nmap

我用python编写了一个NMap-TCP-Port-Scanner,并且一切正常,只是我不再能够看到我在终端上写的内容。

第一件事。

代码:

import argparse, nmap, sys
from threading import *

def initParser():
    parser = argparse.ArgumentParser()
    parser.add_argument("tgtHost", help="Specify target host")
    parser.add_argument("tgtPort", help="Specify target port")
    args = parser.parse_args()
    return (args.tgtHost,args.tgtPort.split(","))

def nmapScan(tgtHost, tgtPorts):
    nm = nmap.PortScanner()
    lock = Semaphore(value=1)
    for tgtPort in tgtPorts:
        t = Thread(target=nmapScanThread, args=(tgtHost, tgtPort, lock, nm))
        t.start()

def nmapScanThread(tgtHost, tgtPort, lock, nm):
    nm.scan(tgtHost, tgtPort)
    state = nm[tgtHost]['tcp'][int(tgtPort)]['state']
    lock.acquire()
    print("Port {} is {}".format(tgtPort, state))
    lock.release()

if __name__ == '__main__':
    (tgtHost, tgtPorts) = initParser()
    nmapScan(tgtHost, tgtPorts)
    sys.exit(0)

因此,运行脚本后,我看不到控制台上正在输入的内容,但是我仍然可以执行不可见的命令。如您所见,我想为每个端口启动一个线程只是因为我正在学习有关线程的知识。

我的假设是,并非所有线程都正确终止,因为在代码中添加“ t.join()”后一切正常。 不幸的是,我无法找到有关此问题的任何信息。

就像这样:

import argparse, nmap, sys
from threading import *

def initParser():
    parser = argparse.ArgumentParser()
    parser.add_argument("tgtHost", help="Specify target host")
    parser.add_argument("tgtPort", help="Specify target port")
    args = parser.parse_args()
    return (args.tgtHost,args.tgtPort.split(","))

def nmapScan(tgtHost, tgtPorts):
    nm = nmap.PortScanner()
    lock = Semaphore(value=1)
    for tgtPort in tgtPorts:
        t = Thread(target=nmapScanThread, args=(tgtHost, tgtPort, lock,  nm))
        t.start()
        t.join()


def nmapScanThread(tgtHost, tgtPort, lock, nm):
    nm.scan(tgtHost, tgtPort)
    state = nm[tgtHost]['tcp'][int(tgtPort)]['state']
    lock.acquire()
    print("Port {} is {}".format(tgtPort, state))
    lock.release()

if __name__ == '__main__':
    (tgtHost, tgtPorts) = initParser()
    nmapScan(tgtHost, tgtPorts)
    sys.exit(0)

是解决此问题的正确方法还是我把事情弄乱了?

另外:

在此示例中,我看不到join()方法有用,因为我认为不带线程的同一个脚本没有任何主要区别

0 个答案:

没有答案