Python获取网段内ping通IP的方法-创新互联
问题描述
创新互联主营北海街道网站建设的网络公司,主营网站建设方案,成都app软件开发公司,北海街道h5小程序设计搭建,北海街道网站营销推广欢迎北海街道等地区企业咨询在某些问题背景下,需要确认是否多台终端在线,也就是会使用我们牛逼的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()
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:Python获取网段内ping通IP的方法-创新互联
文章出自:http://ybzwz.com/article/cohjgj.html