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 13 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
python实现微信防撤回神器
Apr 29 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
基于python实现蓝牙通信代码实例
Nov 19 Python
Pytorch evaluation每次运行结果不同的解决
Jan 02 Python
Python通过socketserver处理多个链接
Mar 18 Python
python删除文件、清空目录的实现方法
Sep 23 Python
提高python代码运行效率的一些建议
Sep 29 Python
Python ellipsis 的用法详解
Nov 20 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 中文处理函数集合
2008/08/27 PHP
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
详解jQuery事件
2017/01/13 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
window下eclipse安装python插件教程
2017/04/24 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
Linux中如何用命令创建目录
2016/12/02 面试题
大学四年学习的自我评价分享
2013/12/09 职场文书
劳资人员岗位职责
2013/12/19 职场文书
新教师工作感言
2014/02/16 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
班级心理活动总结
2014/07/04 职场文书
2014年手术室工作总结
2014/11/26 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
公司酒会主持词
2015/07/02 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript