首页 > 编程 > Python > 正文

Python获取网段内ping通IP的方法

2020-02-16 01:01:04
字体:
来源:转载
供稿:网友

问题描述

在某些问题背景下,需要确认是否多台终端在线,也就是会使用我们牛逼的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()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表