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 正则表达式操作指南
May 04 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
Python实现一个转存纯真IP数据库的脚本分享
May 21 Python
利用Python暴力破解zip文件口令的方法详解
Dec 21 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
python flask安装和命令详解
Apr 02 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
详解Python中list[::-1]的几种用法
Nov 16 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
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
2017/05/21 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
python中list列表的高级函数
2016/05/17 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
Python 从相对路径下import的方法
2018/12/04 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
C++的几个面试题附答案
2016/08/03 面试题
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
新闻专业推荐信范文
2013/11/20 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
农业项目建议书
2014/08/25 职场文书
质量主管工作职责
2014/09/26 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
javascript对象3个属性特征
2021/11/17 Javascript
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS