Python实现的多线程端口扫描工具分享


Posted in Python onJanuary 21, 2015

昨晚今晚写了两晚,总算把Py Port Scanner 写完了,姑且称之为0.1版本,算是一个Python多线程端口扫描工具。

水平有限,实话中间有一些困惑和不解的地方,代码可能也写的比较乱。有些问题并未找到很好的解决方法,还望大家谅解。速度大家自己试验,我感觉还行。

送上效果图两份,分别是扫单IP和扫IP段:

Python实现的多线程端口扫描工具分享

Python实现的多线程端口扫描工具分享

源码:

# -*- coding: utf-8 -*-

__author__ = 'Phtih0n'

import threading, socket, sys, cmd, os, Queue
#扫描常用端口

PortList = [21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015]

#得到一个队列

def GetQueue(list):

    PortQueue = Queue.Queue(65535)

    for p in list:

        PortQueue.put(p)

    return PortQueue
#单IP扫描线程个数

nThread = 20

#线程锁

lock = threading.Lock()

#超时时间

Timeout = 3.0

#打开的端口列表

OpenPort = []
class ScanThread(threading.Thread):

    def __init__(self, scanIP):

        threading.Thread.__init__(self)

        self.IP = scanIP
    def Ping(self, Port):

        global OpenPort, lock, Timeout

        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        sock.settimeout(Timeout)

        address = (self.IP, Port)

        try:

            sock.connect(address)

        except:

            sock.close()

            return False

        sock.close()

        OpenPort.append(Port)

        if lock.acquire():

            print "IP:%s  Port:%d" % (self.IP, Port)

            lock.release()

        return True


class ScanThreadSingle(ScanThread):

    def __init__(self, scanIP, SingleQueue):

        ScanThread.__init__(self, scanIP)

        self.SingleQueue = SingleQueue
    def run(self):

        while not self.SingleQueue.empty():

            p = self.SingleQueue.get()

            self.Ping(p)


class ScanThreadMulti(ScanThread):

    def __init__(self, scanIP, PortList):

        ScanThread.__init__(self, scanIP)

        self.List = PortList[:]
    def run(self):

        for p in self.List:

            self.Ping(p)
class Shell(cmd.Cmd):

    u'''Py Port Scanner 0.1 使用说明:

    port [port..] 设置扫描的端口,用逗号分隔。

        默认:21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015

        example:port 21,23,25

        example: port 1000..2000

        example: port 80,443,1000..1500

    scan [IP] 扫描某一IP地址

        example: scan 192.168.1.5

    search [IP begin]-[IP end] 扫描某一IP段

        example: search 192.168.1.1-192.168.1.100

    time [timeout] 设置超时时间,默认为3秒

        example: time 5

    cls 清楚屏幕内容

    listport 打印端口列表

    help 打开本帮助

        '''

    def __init__(self):

        cmd.Cmd.__init__(self)

        reload(sys)

        sys.setdefaultencoding('utf-8')

        self.prompt = "Port Scan >>"

        self.intro = "Py Port Scanner 0.1"
    def do_EOF(self, line):

        return True
    def do_help(self, line):

        print self.__doc__
    #设置端口

    def do_port(self, line):

        global PortList

        PortList = []

        ListTmp = line.split(',')

        for port in ListTmp:

            if port.find("..") < 0:

                if not port.isdigit():

                    print "输入错误"

                    return False

                PortList.append(int(port))

            else:

                RangeLst = port.split("..")

                if not (RangeLst[0].isdigit() and RangeLst[1].isdigit()):

                    raise ValueError

                    exit()

                for i in range(int(RangeLst[0]), int(RangeLst[1])):

                    PortList.append(i)
    def do_scan(self, line):

        global nThread, PortList

        ThreadList = []

        strIP = line

        SingleQueue = GetQueue(PortList)

        for i in range(0, nThread):

            t = ScanThreadSingle(strIP, SingleQueue)

            ThreadList.append(t)

        for t in ThreadList:

            t.start()

        for t in ThreadList:

            t.join()
    def do_search(self, line):

        global nThread, PortList

        ThreadList = []

        (BeginIP, EndIP) = line.split("-")

        try:

            socket.inet_aton(BeginIP)

            socket.inet_aton(EndIP)

        except:

            print "输入错误"

            return

        IPRange = BeginIP[0:BeginIP.rfind('.')]

        begin = BeginIP[BeginIP.rfind('.') + 1:]

        end = EndIP[EndIP.rfind('.') + 1:]

        for i in range(int(begin), int(end)):

            strIP = "%s.%s" % (IPRange, i)

            t = ScanThreadMulti(strIP, PortList)

            ThreadList.append(t)

        for t in ThreadList:

            t.start()

        for t in ThreadList:

            t.join()
    def do_listport(self, line):

        global PortList

        for p in PortList:

            print p,

        print '\n'
    def do_time(self, line):

        global Timeout

        try:

            Timeout = float(line)

        except:

            print u"参数错误"
    def do_cls(self, line):

        os.system("cls")


if '__main__' == __name__:

    try:

        os.system("cls")

        shell = Shell()

        shell.cmdloop()

    except:

        exit()
Python 相关文章推荐
python使用knn实现特征向量分类
Dec 26 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
python把1变成01的步骤总结
Feb 27 Python
Django 大文件下载实现过程解析
Aug 01 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
python 计算概率密度、累计分布、逆函数的例子
Feb 25 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
python对一个数向上取整的实例方法
Jun 18 Python
通过实例简单了解Python sys.argv[]使用方法
Aug 04 Python
python用Tkinter做自己的中文代码编辑器
Sep 07 Python
python 获取剪切板内容的两种方法
Nov 28 Python
Python中的pprint折腾记
Jan 21 #Python
通过C++学习Python
Jan 20 #Python
python入门之语句(if语句、while语句、for语句)
Jan 19 #Python
Python实现删除Android工程中的冗余字符串
Jan 19 #Python
Python中字典和JSON互转操作实例
Jan 19 #Python
Python中的字典遍历备忘
Jan 17 #Python
Python中处理unchecked未捕获异常实例
Jan 17 #Python
You might like
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
Ext 今日学习总结
2010/09/19 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
JavaScript多线程详解
2015/08/12 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
uniapp,微信小程序中使用 MQTT的问题
2020/07/11 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
node.js通过url读取文件
2020/10/16 Javascript
PyQt5显示GIF图片的方法
2019/06/17 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
寒假家长评语大全
2014/04/16 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
房产协议书范本2014
2014/09/30 职场文书
安装工程师岗位职责
2015/02/13 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书