利用python实现IP扫描
需求:写一个脚本,判断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扫描相关推荐
- 利用python检测IP地址变化并触发事件
IoT PoC项目中需要展示视频采集源进行wifi切换后(表明视频采集源端发生了移动),接收端观看到的视频的流畅度,以及当接收端进行移动时,检测视频的流畅度,故需要一个模块周期性地探测本地IP是否变化 ...
- 已知ip,如何利用python获取ip归属地
可以使用第三方模块 "ipwhois" 来获取 IP 归属地信息.首先需要安装该模块,可以使用命令行运行: pipinstall ipwhois 然后,可以使用以下代码获取 IP ...
- 编写一个python程序,利用scapy数据库构造一个icmp数据包,使其能实现ip扫描
下面是一个使用 scapy 库来构造 ICMP 数据包并进行 IP 扫描的 Python 程序的示例: from scapy.all import *# 设置源 IP 地址和目的 IP 地址 src_ ...
- php 根据ip 扫描端口,python实现指定ip端口扫描方式
在Linux中判断一台主机是否可达,可以使用ping命令,而判断端口是否打开,可以使用telnet命令,但是telnet命令没有超时时间的参数,使用起来不是很方便,那么可以利用Python来完成一个端 ...
- 在Linux上利用python获取本机ip
下面介绍在Linux上利用python获取本机ip的方法. 经过网上调查, 发现大致有两种方法, 一种是调用shell脚本,另一种是利用python中的socket等模块来得到,下面是这两种方法的源码 ...
- python获取指定端口流量_利用python获取nginx服务的ip以及流量统计信息
#!/usr/bin/python #coding=utf8 log_file = "/usr/local/nginx/logs/access.log" with open(log ...
- Python利用matplotlib制作雷达扫描显示仪(之后可结合串口和超声波传感器使用,亦可以做为仪表盘使用)
Python利用matplotlib制作雷达扫描显示仪(之后可结合串口和超声波传感器使用,亦可以做为仪表盘使用).内有制作雷达扫描GIF图的源代码包含. ''' matplotlib雷达扫描 ''' ...
- Python Pyside2 多线程实现局域网IP扫描
利用pyside2实现带界面的局域网IP扫描工具 from PySide2.QtWidgets import QApplication, QMessageBox from PySide2.QtUiTo ...
- 明星不是梦#利用Python进行网站日志分析
网站的访问日志是一个非常重要的文件,通过分析访问日志,能够挖掘出很多有价值的信息.本文介绍如何利用Python对一个真实网站的访问日志进行分析,文中将综合运用Python文件操作.字符串处理.列表.集 ...
最新文章
- Cisco路由器交换机安全配置
- U3D的有限状态机系统
- Oracle数据库学习
- 「干货」Web安全红队外围信息收集「详细总结」
- Oracle 购买价格 和 服务费 计算方式
- 数学建模——层次分析法,一致性检验学习笔记(一)
- 计算机蜂鸣无法开机,计算机开机后会时常出现3声蜂鸣是什么原因
- UnicodeEncodeError: ‘charmap‘ codec can‘t encode characters in position 0-1: character maps to <unde
- 光功率 博科交换机_FAQ-交换机是否支持查看光模块型号及收发光功率
- css之透明度和外发光
- layer.open打不开弹窗的问题
- 金融风险管理基本框架
- 解决:AWVS(Acunetix)激活频繁失效(仅供学习)
- 切切切词!新词发现算法TopWORDS的原理及实现|实在智能AI+RPA学院
- 列表推导式-list comprehension
- Linux查看安装包
- SpringBoot+ElasticSearch根据经纬度,简单搜索指定距离范围内的数据
- Android面试过程描述
- 《the Great Gatsby》Day 32
- TOPS/W什么意思