使用argparse包,threading包。
实现线程扫描,还有信号量来避免乱码和失序。
使用screenLock.acquire()进行加锁,如果信号量没有被锁上,线程就有权继续运行,并且输出打印到屏幕上。如果信号量已经被锁定,只能等待持有信号量的线程释放信号量。通过利用信号量来确保在任何给定的时间点上只有一个线程可以打印屏幕。
#coding=utf-8
import argparse
from socket import *
from threading import *
#Semaphore,是负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
screenLock = Semaphore(value=1)
def connScan(tgtHost,tgtPort):
try:
connSkt = socket(AF_INET,SOCK_STREAM)
connSkt.connect((tgtHost,tgtPort))
connSkt.send("hello\n")
results = connSkt.recv(1000)
#进程上锁,如果信号量可以使用,执行下面代码,如果不能使用,则等待使用
screenLock.acquire()
print "%d/tcp open "%tgtPort
print str(results)
except:
screenLock.acquire()
print "%d/closed"%tgtPort
finally:
#结束的时候释放锁
screenLock.release()
connSkt.close()
def portScan(tgtHost,tgtPorts):
try:
tgtIP = gethostbyname(tgtHost)
except:
print "can not solve '%s':Unknown host"%tgtHost
return
try:
tgtName = gethostbyaddr(tgtIP)
print "Scan result for "+tgtName[0]
except:
print "Scan result for "+tgtIP
setdefaulttimeout(1)
for tgtPort in tgtPorts:
t = Thread(target=connScan,args=(tgtHost,int(tgtPort)))
t.start()
def main():
'''程序的参数解析,调用函数等'''
parser = argparse.ArgumentParser()
parser.add_argument('-H',dest="tgtHost")
parser.add_argument('-p',dest="tgtPort")
args = parser.parse_args()
tgtHost = args.tgtHost
tgtPorts = args.tgtPort.split(",")
if (tgtHost==None) | (tgtPorts[0]==None):
print "you must specify a target host and post"
print tgtHost
print tgtPorts
portScan(tgtHost,tgtPorts)
if __name__=="__main__":
main()```
网友评论