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 相关文章推荐
Python3使用requests发闪存的方法
May 11 Python
基于Python os模块常用命令介绍
Nov 03 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
Python从零开始创建区块链
Mar 06 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
python将dict中的unicode打印成中文实例
May 11 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 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删除目录及目录下所有文件的方法详解
2013/06/06 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
python实现从字典中删除元素的方法
2015/05/04 Python
Django实现表单验证
2018/09/08 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
将python图片转为二进制文本的实例
2019/01/24 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
Python匿名函数及应用示例
2019/04/09 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Python递归函数特点及原理解析
2020/03/04 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
python Scrapy框架原理解析
2021/01/04 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
服务员自我评价
2014/01/25 职场文书
企业读书活动总结
2014/06/30 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
大学生创业事迹材料
2014/12/30 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
MySQL常见优化方案汇总
2022/01/18 MySQL