端口扫描器

使用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()```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容