需求:写一个脚本,判断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()

执行效果:

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

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))

执行结果:

线程池异步执行 – 开启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))

执行结果:

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

使用gevent前,需要pip install gevent

from gevent import monkey;monkey.patch_all()
import gevent
import os
import time
import subprocessdef 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))

执行结果:

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

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

最后附带协程池代码

gevent.pool

from gevent import monkey;monkey.patch_all()
import gevent
import os
import time
import subprocess
import gevent.pooldef 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))

执行结果:

利用python实现IP扫描相关推荐

  1. 利用python检测IP地址变化并触发事件

    IoT PoC项目中需要展示视频采集源进行wifi切换后(表明视频采集源端发生了移动),接收端观看到的视频的流畅度,以及当接收端进行移动时,检测视频的流畅度,故需要一个模块周期性地探测本地IP是否变化 ...

  2. 已知ip,如何利用python获取ip归属地

    可以使用第三方模块 "ipwhois" 来获取 IP 归属地信息.首先需要安装该模块,可以使用命令行运行: pipinstall ipwhois 然后,可以使用以下代码获取 IP ...

  3. 编写一个python程序,利用scapy数据库构造一个icmp数据包,使其能实现ip扫描

    下面是一个使用 scapy 库来构造 ICMP 数据包并进行 IP 扫描的 Python 程序的示例: from scapy.all import *# 设置源 IP 地址和目的 IP 地址 src_ ...

  4. php 根据ip 扫描端口,python实现指定ip端口扫描方式

    在Linux中判断一台主机是否可达,可以使用ping命令,而判断端口是否打开,可以使用telnet命令,但是telnet命令没有超时时间的参数,使用起来不是很方便,那么可以利用Python来完成一个端 ...

  5. 在Linux上利用python获取本机ip

    下面介绍在Linux上利用python获取本机ip的方法. 经过网上调查, 发现大致有两种方法, 一种是调用shell脚本,另一种是利用python中的socket等模块来得到,下面是这两种方法的源码 ...

  6. python获取指定端口流量_利用python获取nginx服务的ip以及流量统计信息

    #!/usr/bin/python #coding=utf8 log_file = "/usr/local/nginx/logs/access.log" with open(log ...

  7. Python利用matplotlib制作雷达扫描显示仪(之后可结合串口和超声波传感器使用,亦可以做为仪表盘使用)

    Python利用matplotlib制作雷达扫描显示仪(之后可结合串口和超声波传感器使用,亦可以做为仪表盘使用).内有制作雷达扫描GIF图的源代码包含. ''' matplotlib雷达扫描 ''' ...

  8. Python Pyside2 多线程实现局域网IP扫描

    利用pyside2实现带界面的局域网IP扫描工具 from PySide2.QtWidgets import QApplication, QMessageBox from PySide2.QtUiTo ...

  9. 明星不是梦#利用Python进行网站日志分析

    网站的访问日志是一个非常重要的文件,通过分析访问日志,能够挖掘出很多有价值的信息.本文介绍如何利用Python对一个真实网站的访问日志进行分析,文中将综合运用Python文件操作.字符串处理.列表.集 ...

最新文章

  1. Cisco路由器交换机安全配置
  2. U3D的有限状态机系统
  3. Oracle数据库学习
  4. 「干货」Web安全红队外围信息收集「详细总结」
  5. Oracle 购买价格 和 服务费 计算方式
  6. 数学建模——层次分析法,一致性检验学习笔记(一)
  7. 计算机蜂鸣无法开机,计算机开机后会时常出现3声蜂鸣是什么原因
  8. UnicodeEncodeError: ‘charmap‘ codec can‘t encode characters in position 0-1: character maps to <unde
  9. 光功率 博科交换机_FAQ-交换机是否支持查看光模块型号及收发光功率
  10. css之透明度和外发光
  11. layer.open打不开弹窗的问题
  12. 金融风险管理基本框架
  13. 解决:AWVS(Acunetix)激活频繁失效(仅供学习)
  14. 切切切词!新词发现算法TopWORDS的原理及实现|实在智能AI+RPA学院
  15. 列表推导式-list comprehension
  16. Linux查看安装包
  17. SpringBoot+ElasticSearch根据经纬度,简单搜索指定距离范围内的数据
  18. Android面试过程描述
  19. 《the Great Gatsby》Day 32
  20. TOPS/W什么意思

热门文章

  1. 微信小程序获取多选框选中值和选中值对应的id
  2. ThunderGBM:快成一道闪电的梯度提升决策树
  3. Power Designer逆向工程导入Oracle表,转为模型加注释
  4. 多媒体视像会议中音视频矩阵的用途
  5. JS 中 URL 编码的问题.
  6. WPF学习拾遗(二)TextBlock换行
  7. 利用JS使用POST方式提交请求的方法
  8. 【Go语言】LiteIDE使用的个人使用方法
  9. RHEL5 install
  10. GIS开发随笔(2)——关于建立GIS数据库的几个问题