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获取android设备的GPS信息脚本分享
Mar 06 Python
python实现发送邮件及附件功能
Mar 02 Python
Tensorflow简单验证码识别应用
May 25 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
python检索特定内容的文本文件实例
Jun 05 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
对python制作自己的数据集实例讲解
Dec 12 Python
Python3读写ini配置文件的示例
Nov 06 Python
python实现图片,视频人脸识别(dlib版)
Nov 18 Python
用python批量解压带密码的压缩包
May 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和ACCESS写聊天室(八)
2006/10/09 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
BootStrap模态框不垂直居中的解决方法
2017/10/19 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
Python列表计数及插入实例
2014/12/17 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
Numpy 多维数据数组的实现
2020/06/18 Python
英国床垫在线:Mattress Online
2016/12/07 全球购物
学生自我评价范文
2014/02/02 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
大学生交通专业求职信
2014/09/01 职场文书
老乡会致辞
2015/07/28 职场文书
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python
python通过新建环境安装tfx的问题
2022/05/20 Python