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计算N天之后日期的方法
Mar 31 Python
Python将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
python实现批量按比例缩放图片效果
Mar 30 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
带你认识Django
Jan 15 Python
Python中正则表达式的用法总结
Feb 22 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
Python 分享10个PyCharm技巧
Jul 13 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
如何用python 操作zookeeper
Dec 28 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/04/20 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
用pandas中的DataFrame时选取行或列的方法
2018/07/11 Python
浅谈python之新式类
2018/08/12 Python
python程序控制NAO机器人行走
2019/04/29 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
python中添加模块导入路径的方法
2021/02/03 Python
Python实现简单的2048小游戏
2021/03/01 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
中国制造网:Made-in-China.com
2019/10/25 全球购物
大专生毕业的自我评价
2014/02/06 职场文书
公司管理建议书范文
2014/03/12 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python