您好,登錄后才能下訂單哦!
問題描述
在某些問題背景下,需要確認是否多臺終端在線,也就是會使用我們牛逼的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的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。