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标准库之多进程(multiprocessing包)介绍
Nov 25 Python
python中的__slots__使用示例
Feb 26 Python
Python脚本文件打包成可执行文件的方法
Jun 02 Python
python创建列表和向列表添加元素的实现方法
Dec 25 Python
Python函数和模块的使用总结
May 20 Python
python添加菜单图文讲解
Jun 04 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 Python
opencv+python实现均值滤波
Feb 19 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
Mar 27 Python
python实现文字版扫雷
Apr 24 Python
Python实现随机生成迷宫并自动寻路
Jun 13 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 学习路线与时间表
2010/02/21 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
PHP类的反射用法实例
2014/11/03 PHP
PHP使用递归生成文章树
2015/04/21 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
用客户端js实现带省略号的分页
2013/04/27 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
Python中的各种装饰器详解
2015/04/11 Python
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
Linux下python制作名片示例
2018/07/20 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
python系列 文件操作的代码
2019/10/06 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
pycharm快捷键汇总
2020/02/14 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
成教自我鉴定
2013/10/27 职场文书
护理学毕业生求职信
2013/11/14 职场文书
优秀学生评语大全
2014/04/25 职场文书
家长会欢迎标语
2014/06/24 职场文书
个人廉政承诺书
2015/04/28 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP