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中.join()和os.path.join()两个函数的用法详解
Jun 11 Python
详解python3中zipfile模块用法
Jun 18 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
python 实现矩阵填充0的例子
Nov 29 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
pycharm全局搜索的具体步骤
Jul 28 Python
谈谈python垃圾回收机制
Sep 27 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 Python
python 实现控制鼠标键盘
Nov 27 Python
pandas按条件筛选数据的实现
Feb 20 Python
python高温预警数据获取实例
Jul 23 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/07/17 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
php经典算法集锦
2015/11/14 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
用实例说明python的*args和**kwargs用法
2013/11/01 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
PyQT实现多窗口切换
2018/04/20 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
Python元组知识点总结
2019/02/18 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
英国女性时尚品牌:Apricot
2018/12/04 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
毕业生护理专业个人求职信范文
2014/01/04 职场文书
好军嫂事迹材料
2014/01/15 职场文书
网吧消防安全制度
2014/01/28 职场文书
研究生导师评语
2014/12/31 职场文书
Python中可变和不可变对象的深入讲解
2021/08/02 Python
Windows7下FTP搭建图文教程
2022/08/05 Servers