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中私有函数调用方法解密
Apr 29 Python
python实现比较文件内容异同
Jun 22 Python
Python-接口开发入门解析
Aug 01 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
django框架两个使用模板实例
Dec 11 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
python区块链持久化和命令行接口实现简版
May 25 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程序
2006/10/09 PHP
使用PHP获取汉字的拼音(全部与首字母)
2013/06/27 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
php创建多级目录的方法
2015/03/24 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
php高清晰度无损图片压缩功能的实现代码
2018/12/09 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
Python中的choice()方法使用详解
2015/05/15 Python
spyder常用快捷键(分享)
2017/07/19 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
Python中的asyncio代码详解
2019/06/10 Python
Python input函数使用实例解析
2019/11/22 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
使用python实现名片管理系统
2020/06/18 Python
python上selenium的弹框操作实现
2020/07/13 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
仓库文员岗位职责
2014/04/06 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
小学家长通知书评语
2014/12/31 职场文书
团代会闭幕词
2015/01/28 职场文书
2016情人节宣传语
2015/07/14 职场文书
JavaScript实例 ODO List分析
2022/01/22 Javascript
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL