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常用小技巧总结
Jun 01 Python
在Python的Django框架中创建和使用模版
Jul 15 Python
python requests 使用快速入门
Aug 31 Python
python如何在列表、字典中筛选数据
Mar 19 Python
python实现朴素贝叶斯分类器
Mar 28 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
Django数据库类库MySQLdb使用详解
Apr 28 Python
python的turtle库使用详解
May 10 Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
Mar 24 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
python程序如何进行保存
Jul 03 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操作数组相关函数
2011/02/03 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
[01:46]新英雄登场
2019/09/10 DOTA
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
小学家长会邀请函
2014/01/23 职场文书
学习自我鉴定
2014/02/01 职场文书
关于保护环境的建议书
2014/05/13 职场文书
一年级小学生评语大全
2014/12/25 职场文书
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers