时间:2021-05-22
问题描述
在某些问题背景下,需要确认是否多台终端在线,也就是会使用我们牛逼的ping这个命令,做一些的ping操作,如果需要确认的设备比较少,也还能承受。倘若,在手中维护的设备很多。那么这无疑会变成一个恼人的问题。脚本的作用就凸显了。另外,我们需要使用多线程的一种措施,否则单线程很难在很短的时间内拿到统计结果。
应用背景
有多台设备需要维护,周期短,重复度高;
单台设备配备多个IP,需要经常确认网络是否通常;
等等其他需要确认网络是否畅通的地方
问题解决
使用python自带threading模块,实现多线程的并发操作。如果本机没有相关的python模块,请使用pip install package name安装之。
threading并发ping操作代码实现
这部分代码取材于网络,忘记是不是stackoverflow,这不重要,重要的是这段代码或者就有价值,代码中部分关键位置做了注释,可以自行定义IP所属的网段,以及使用的线程数量。从鄙人的观点来看是一段相当不错的代码,
# -*- coding: utf-8 -*-import sysimport osimport platformimport subprocessimport Queueimport threadingimport ipaddressimport redef 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 = 14plat = 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 = 0while 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 subprocessimport itertoolsfrom gevent.pool import Poolpool = Pool(100) # concurrent action countips = 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 Noneresps = pool.map(get_response_time, ips)reachable_resps = filter(lambda (ip): ip != None, resps)for ip in reachable_resps: print ipgithub目录:git@github.com:qcq/Code.git 下的子目录utils内部。
以上这篇Python获取网段内ping通IP的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Docker容器内不能联网的6种解决方案注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping
本地连接稳定。检查方法:交换机下接两台电脑,设置在同一网段,相互之间若能ping通,则电脑和交换机之间连接稳定。192.168.0.1,那么你的本地ip地址可以
python调用本地powershell方法1、现在准备一个简陋的powershell脚本,功能是测试一个IP列表哪些可以ping通:复制代码代码如下:func
需要ping一个网段所有机器的在线情况,shell脚步运行时间太长,用python写个多线程ping吧,代码如下:#!/usr/bin/python#codin
问题描述esxi内的windows上安装workstations后,里面的虚拟机只能ping通windows宿主机的地址,ping不通其他的ip地址。具体思路怀