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 相关文章推荐
剖析Django中模版标签的解析与参数传递
Jul 21 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
Python字符串、整数、和浮点型数相互转换实例
Aug 04 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
Python+threading模块对单个接口进行并发测试
Jun 25 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
Python dict和defaultdict使用实例解析
Mar 12 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 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
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
Prototype Selector对象学习
2009/07/23 Javascript
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
2015/03/27 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
jquery 手势密码插件
2017/03/17 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
webpack配置之后端渲染详解
2017/10/26 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
什么是python的自省
2020/06/21 Python
navabi英国:设计师大码女装
2019/06/25 全球购物
学校食堂采购员岗位职责
2013/12/05 职场文书
工程管理专业个人求职信范文
2013/12/07 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL