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

2024-06-25 05:33:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用python编写了一个NMap-TCP端口扫描器,所有的东西都工作得很好,只是我再也看不到我在终端上写的东西了

第一件事

代码:

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()方法有用,因为我不认为在没有线程的情况下,同一个脚本有什么主要区别


Tags: importlockparsertargetdefsysargparseargs