iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >利用python实现IP扫描
  • 624
分享到

利用python实现IP扫描

pythonIP 2023-01-31 07:01:05 624人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

需求:写一个脚本,判断192.168.11.0/24网络里,当前在线ip有哪些?知识点:1 使用subprocess模块,来调用系统命令,执行ping 192.168.11.xxx 命令2 调用系统命令执行ping命令的时候,会有返回值(p

    需求:写一个脚本,判断192.168.11.0/24网络里,当前在线ip有哪些?

    知识点:

    1 使用subprocess模块,来调用系统命令,执行ping 192.168.11.xxx 命令

    2 调用系统命令执行ping命令的时候,会有返回值(ping的结果),需要用到stdout=fnull, stderr=fnull方法,屏蔽系统执行命令的返回值

     

    常规版本(代码)

    import os
    import time
    import subprocess
    def ping_call():
        start_time = time.time()
        fnull = open(os.devnull, 'w')
        for i in range(1, 256):
            ipaddr = 'ping 192.168.11.' + str(i)
            result = subprocess.call(ipaddr + ' -n 2', shell=True, stdout=fnull, stderr=fnull)
            current_time = time.strftime('%Y%m%d-%H:%M:%S', time.localtime())
            if result:
                print('时间:{} ip地址:{} ping fall'.fORMat(current_time, ipaddr))
            else:
                print('时间:{} ip地址:{} ping ok'.format(current_time, ipaddr))
        print('程序耗时{:.2f}'.format(time.time() - start_time))
        fnull.close()
    ping_call()

    执行效果:

    blob.png


    上面的执行速度非常慢,怎么能让程序执行速度快起来?

    python提供了进程,线程,协程。分别用这三个对上面代码改进,提高执行效率,测试一波效率


    进程池异步执行 -- 开启20个进程

    import os
    import time
    import subprocess
    from multiprocessing import Pool
    def ping_call(num):
        fnull = open(os.devnull, 'w')
        ipaddr = 'ping 192.168.11.' + str(num)
        result = subprocess.call(ipaddr + ' -n 2', shell=True, stdout=fnull, stderr=fnull)
        current_time = time.strftime('%Y%m%d-%H:%M:%S', time.localtime())
        if result:
            print('时间:{} ip地址:{} ping fall'.format(current_time, ipaddr))
        else:
            print('时间:{} ip地址:{} ping ok'.format(current_time, ipaddr))
    
        fnull.close()
    
    
    if __name__ == '__main__':
        start_time = time.time()
        p = Pool(20)
        res_l = []
        for i in range(1, 256):
            res = p.apply_async(ping_call, args=(i,))
            res_l.append(res)
        for res in res_l:
            res.get()
        print('程序耗时{:.2f}'.format(time.time() - start_time))

    执行结果:

    blob.png



    线程池异步执行 -- 开启20个线程

    import os
    import time
    import subprocess
    from concurrent.futures import ThreadPoolExecutor
    def ping_call(num):
        fnull = open(os.devnull, 'w')
        ipaddr = 'ping 192.168.11.' + str(num)
        result = subprocess.call(ipaddr + ' -n 2', shell=True, stdout=fnull, stderr=fnull)
        current_time = time.strftime('%Y%m%d-%H:%M:%S', time.localtime())
        if result:
            print('时间:{} ip地址:{} ping fall'.format(current_time, ipaddr))
        else:
            print('时间:{} ip地址:{} ping ok'.format(current_time, ipaddr))
        fnull.close()
    
    if __name__ == '__main__':
        start_time = time.time()
        thread_pool = ThreadPoolExecutor(20)
        ret_lst = []
        for i in range(1, 256):
            ret = thread_pool.submit(ping_call, i)
            ret_lst.append(ret)
        thread_pool.shutdown()
        for ret in ret_lst:
            ret.result()
        print('线程池(20)异步-->耗时{:.2f}'.format(time.time() - start_time))

    执行结果:

    blob.png



    协程执行---(执行多个任务,遇到I/O操作就切换)

    使用gevent前,需要pip install gevent

    from gevent import monkey;monkey.patch_all()
    import gevent
    import os
    import time
    import subprocess
    
    def ping_call(num):
        fnull = open(os.devnull, 'w')
        ipaddr = 'ping 192.168.11.' + str(num)
        result = subprocess.call(ipaddr + ' -n 2', shell=True, stdout=fnull, stderr=fnull)
        current_time = time.strftime('%Y%m%d-%H:%M:%S', time.localtime())
        if result:
            print('时间:{} ip地址:{} ping fall'.format(current_time, ipaddr))
        else:
            print('时间:{} ip地址:{} ping ok'.format(current_time, ipaddr))
        fnull.close()
    
    def asynchronous(): # 异步
        g_l = [gevent.spawn(ping_call, i) for i in range(1, 256)]
        gevent.joinall(g_l)
    
    if __name__ == '__main__':
        start_time = time.time()
        asynchronous()
        print('协程执行-->耗时{:.2f}'.format(time.time() - start_time))

    执行结果:

    blob.png


    遇到I/O操作,协程的效率比进程,线程高很多!

    总结:python中,涉及到I/O阻塞的程序中,使用协程的效率最高


    最后附带协程池代码

    gevent.pool

    from gevent import monkey;monkey.patch_all()
    import gevent
    import os
    import time
    import subprocess
    import gevent.pool
    
    def ping_call(num):
        fnull = open(os.devnull, 'w')
        ipaddr = 'ping 192.168.11.' + str(num)
        result = subprocess.call(ipaddr + ' -n 2', shell=True, stdout=fnull, stderr=fnull)
        current_time = time.strftime('%Y%m%d-%H:%M:%S', time.localtime())
        if result:
            print('时间:{} ip地址:{} ping fall'.format(current_time, ipaddr))
        else:
            print('时间:{} ip地址:{} ping ok'.format(current_time, ipaddr))
        fnull.close()
    
    if __name__ == '__main__':
        start_time = time.time()
        res_l = []
        p = gevent.pool.Pool(100)
        for i in range(1, 256):
            res_l.append(p.spawn(ping_call, i))
        gevent.joinall(res_l)
        print('协程池执行-->耗时{:.2f}'.format(time.time() - start_time))

    执行结果:

    blob.png

     欢迎大家一起来玩好PY,一起交流。QQ群:198447500

--结束END--

本文标题: 利用python实现IP扫描

本文链接: https://www.lsjlt.com/news/191356.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用python实现IP扫描
    需求:写一个脚本,判断192.168.11.0/24网络里,当前在线ip有哪些?知识点:1 使用subprocess模块,来调用系统命令,执行ping 192.168.11.xxx 命令2 调用系统命令执行ping命令的时候,会有返回值(p...
    99+
    2023-01-31
    python IP
  • Python利用tkinter和socket实现端口扫描
    目录题目参考code题目 请设计并实现一款主机端口扫描程序。程序根据用户输入的域名或IP地址,可以查询该主机的开放的端口号。 例如: 并有一定的异常处理 参考code impor...
    99+
    2022-12-08
    Python tkinter socket端口扫描 Python socket端口扫描 Python 端口扫描
  • python实现局域网ip地址扫描
    python 遍历局域网ip 从知道python开始,我的视线里就没缺少过他。尤其是现如今开发语言大有傻瓜化的趋势。而作为这一趋势的领导,脚本语言就显得格外亮眼。不管是python还是ruby,perl,都火的不得了。就连java都出了个...
    99+
    2023-01-31
    局域网 地址 python
  • 利用Python实现端口扫描器的全过程
    目录socket概念 socket基本用法 创建tcp套接字 创建udp套接字 socket内建方法实现端口扫描 总结socket概念 socket又称套接字,可以看做是不同主机之...
    99+
    2024-04-02
  • Python利用socket实现多进程的端口扫描器
    作为开发人员经常需要查看服务的端口开启状态判断服务是否宕机。 特别是部署的服务比较多的情况下,可能存在几个甚至几十个服务端口的占用,于是我利用socket不断向服务发送请求的方式来判...
    99+
    2022-12-08
    Python socket多进程端口扫描 Python socket 端口扫描 Python 端口扫描
  • 利用LyScript实现应用层钩子扫描器
    Capstone 是一个轻量级的多平台、多架构的反汇编框架,该模块支持目前所有通用操作系统,反汇编架构几乎全部支持,本篇文章将运用LyScript插件结合Capstone反汇编引擎实...
    99+
    2024-04-02
  • Java实现局域网IP地址扫描
    Java扫描局域网地址主要通过CMD命令,主要通过Runtime和Process类,由于同一局域网下的IP地址比较多需要通过Java的多线程来扫描端口。 import java.io...
    99+
    2024-04-02
  • MATLAB 实现zigzag扫描(z字形扫描)
    Zigzag扫描(也称为Z字形扫描)是一种图像编码技术,用于将二维矩阵中的元素按照特定的顺序排列。以下是MATLAB实现Zigzag...
    99+
    2023-10-12
    MATLAB
  • 调用python-nmap实现扫描局域网
    使用环境:Raspberry 3b+ +netifaces+python-nmap+nmap 调用netifaces自动获取ip地址: def get_gateways(): return netifaces.gateways(...
    99+
    2023-01-30
    局域网 python nmap
  • golang实现syn扫描
    随着互联网的普及,网络安全问题日益严峻。网络攻击手段层出不穷,其中SYN扫描是一种常见的攻击手段。SYN扫描是通过发送TCP SYN包到目标主机的开放端口来检查目标主机的可访问性的一种方式。本文将介绍使用Golang实现SYN扫描的方法。一...
    99+
    2023-05-14
  • Python实现对网站目录扫描
    一个很简单的版本,以后会做进一步的修改:多线程,从文件中读取,跟据Head头判断等等. 需要提供一个网站和不存在页面的错误提示 CODE: #!/usr/bin/env python # -*- coding:utf-8 -*-&...
    99+
    2023-01-31
    目录 网站 Python
  • 利用python写的web路径扫描工具
    本篇内容介绍了“利用python写的web路径扫描工具”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!现成的WEB路径扫描工具颇多,但都不尽如...
    99+
    2023-06-17
  • Python+OpenCV实战之实现文档扫描
    目录1.效果展示2.项目准备3.代码的讲解与展示4.项目资源5.项目总结与评价1.效果展示 网络摄像头扫描:   图片扫描:  最终扫描保存的图片: &n...
    99+
    2024-04-02
  • 利用Python脚本写端口扫描器socket,python-nmap
    目录Socket模块编写扫描给定主机是否开放了指定的端口python-nmap模块编写 扫描给定ip或给定网段内指定端口是否开放前言: 一个用python写的简单的端口扫描...
    99+
    2024-04-02
  • python扫描ip的端口打开情况
    我们的韩国bss系统上线之后,要求对主机的端口、资源使用进行统计,端口每个主机去看,太费劲了,所以,就写了这样一个小程序,不是很完美但是,可以用啊!哈哈哈,别喷,本人是个菜鸟#!/usr/bin/python # -*- coding:ut...
    99+
    2023-01-31
    端口 情况 python
  • C#使用Twain协议实现扫描仪连续扫描功能
    C#调用Twain接口实现扫描仪连续扫描。在监听的TwainCommand.TransferReady状态中,是调用扫描仪扫描图片的。我开始的时候尝试修改twain类中Transfe...
    99+
    2024-04-02
  • Python怎么用tkinter和socket实现端口扫描
    这篇文章主要介绍“Python怎么用tkinter和socket实现端口扫描”,在日常操作中,相信很多人在Python怎么用tkinter和socket实现端口扫描问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-04
  • python实现打印扫描效果详情
    目录1. 介绍2. 完整代码 1. 介绍 前面我们尝试通过python实现了代码雨以及字母随机闪烁的效果,这次,我们再来实现一个代码的线性扫面。 同样的,此次我们仍然是使用30行代码...
    99+
    2024-04-02
  • C#怎么使用Twain协议实现扫描仪连续扫描功能
    本篇内容主要讲解“C#怎么使用Twain协议实现扫描仪连续扫描功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么使用Twain协议实现扫描仪连续扫描功能”吧!C#调用Twain接口实现扫...
    99+
    2023-06-26
  • 用Python实现一个端口扫描,只需简单
    0、秘密扫描 秘密扫描是一种不被审计工具所检测的扫描技术。 它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己。 秘密扫描能躲避IDS、防火墙、包过滤器和日志审计,从而获取目标端口的开放或关闭的信息。由于没有包含...
    99+
    2023-01-30
    只需 简单 端口扫描
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作