Python获取网段内ping通IP的方法


Posted in Python onJanuary 31, 2019

问题描述

在某些问题背景下,需要确认是否多台终端在线,也就是会使用我们牛逼的ping这个命令,做一些的ping操作,如果需要确认的设备比较少,也还能承受。倘若,在手中维护的设备很多。那么这无疑会变成一个恼人的问题。脚本的作用就凸显了。另外,我们需要使用多线程的一种措施,否则单线程很难在很短的时间内拿到统计结果。

应用背景

有多台设备需要维护,周期短,重复度高;

单台设备配备多个IP,需要经常确认网络是否通常;

等等其他需要确认网络是否畅通的地方

问题解决

使用python自带threading模块,实现多线程的并发操作。如果本机没有相关的python模块,请使用pip install package name安装之。

threading并发ping操作代码实现

这部分代码取材于网络,忘记是不是stackoverflow,这不重要,重要的是这段代码或者就有价值,代码中部分关键位置做了注释,可以自行定义IP所属的网段,以及使用的线程数量。从鄙人的观点来看是一段相当不错的代码,

# -*- coding: utf-8 -*-

import sys
import os
import platform
import subprocess
import Queue
import threading
import ipaddress
import re

def worker_func(pingArgs, pending, done):
 try:
  while True:
   # Get the next address to ping.
   address = pending.get_nowait()

   ping = subprocess.Popen(pingArgs + [address],
    stdout = subprocess.PIPE,
    stderr = subprocess.PIPE
   )
   out, error = ping.communicate()

   if re.match(r".*, 0% packet loss.*", out.replace("\n", "")):
    done.put(address)

   # Output the result to the 'done' queue.
 except Queue.Empty:
  # No more addresses.
  pass
 finally:
  # Tell the main thread that a worker is about to terminate.
  done.put(None)

# The number of workers.
NUM_WORKERS = 14

plat = platform.system()
scriptDir = sys.path[0]
hosts = os.path.join(scriptDir, 'hosts.txt')

# The arguments for the 'ping', excluding the address.
if plat == "Windows":
 pingArgs = ["ping", "-n", "1", "-l", "1", "-w", "100"]
elif plat == "Linux":
 pingArgs = ["ping", "-c", "1", "-l", "1", "-s", "1", "-W", "1"]
else:
 raise ValueError("Unknown platform")

# The queue of addresses to ping.
pending = Queue.Queue()

# The queue of results.
done = Queue.Queue()

# Create all the workers.
workers = []
for _ in range(NUM_WORKERS):
 workers.append(threading.Thread(target=worker_func, args=(pingArgs, pending, done)))

# Put all the addresses into the 'pending' queue.
for ip in list(ipaddress.ip_network(u"10.69.69.0/24").hosts()):
 pending.put(str(ip))

# Start all the workers.
for w in workers:
 w.daemon = True
 w.start()

# Print out the results as they arrive.

numTerminated = 0
while numTerminated < NUM_WORKERS:
 result = done.get()
 if result is None:
  # A worker is about to terminate.
  numTerminated += 1
 else:
  print result # print out the ok ip

# Wait for all the workers to terminate.
for w in workers:
 w.join()

使用资源池的概念,直接使用gevent这么python模块提供的相关功能。

资源池代码实现

这部分代码,是公司的一个Python方面的大师的作品,鄙人为了这个主题做了小调整。还是那句话,只要代码有价值,有生命力就是对的,就是值得的。

# -*- coding: utf-8 -*-

from gevent import subprocess
import itertools
from gevent.pool import Pool

pool = Pool(100) # concurrent action count

ips = itertools.product((10, ), (69, ), (69, ), range(1, 255))

def get_response_time(ip):
 try:
  out = subprocess.check_output('ping -c 1 -W 1 {}.{}.{}.{}'.format(*ip).split())
  for line in out.splitlines():
   if '0% packet loss' in line:
    return ip
 except subprocess.CalledProcessError:
  pass

 return None

resps = pool.map(get_response_time, ips)
reachable_resps = filter(lambda (ip): ip != None, resps)

for ip in reachable_resps:
 print ip

github目录:git@github.com:qcq/Code.git 下的子目录utils内部。

以上这篇Python获取网段内ping通IP的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现rest请求api示例
Apr 22 Python
python实现unicode转中文及转换默认编码的方法
Apr 29 Python
浅谈function(函数)中的动态参数
Apr 30 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
python批量修改文件编码格式的方法
May 31 Python
pandas.DataFrame.to_json按行转json的方法
Jun 05 Python
Flask配置Cors跨域的实现
Jul 12 Python
详解Django-channels 实现WebSocket实例
Aug 22 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
Python Selenium自动化获取页面信息的方法
Aug 31 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 #Python
python重试装饰器的简单实现方法
Jan 31 #Python
Python实现合并两个有序链表的方法示例
Jan 31 #Python
Django 日志配置按日期滚动的方法
Jan 31 #Python
Python类的继承用法示例
Jan 31 #Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 #Python
python3使用QQ邮箱发送邮件
May 20 #Python
You might like
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
Linux面试题LINUX系统类
2015/11/25 面试题
管理信息系学生的自我评价
2014/01/11 职场文书
关于迟到的检讨书
2014/01/26 职场文书
创业融资计划书
2014/04/25 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python