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多线程(python多线程简明教程)
Jun 09 Python
Python中无限元素列表的实现方法
Aug 18 Python
python实现颜色rgb和hex相互转换的函数
Mar 19 Python
Python中__new__与__init__方法的区别详解
May 04 Python
Django 如何获取前端发送的头文件详解(推荐)
Aug 15 Python
python实现多线程网页下载器
Apr 15 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
Numpy之random函数使用学习
Jan 29 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
详解如何减少python内存的消耗
Aug 09 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 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
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
pycharm运行scrapy过程图解
2019/11/22 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
Python实现简单的2048小游戏
2021/03/01 Python
thinkphp5 路由分发原理
2021/03/18 PHP
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
办护照工作证明范本
2014/01/14 职场文书
青年文明号服务承诺
2014/03/31 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
个人租房协议书范本
2014/09/30 职场文书
爱国教育主题班会
2015/08/14 职场文书
导游词之任弼时故居
2020/01/07 职场文书
V Rising 服务器搭建图文教程
2022/06/16 Servers