亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python獲取網段內ping通IP的方法

發布時間:2020-10-03 00:49:24 來源:腳本之家 閱讀:411 作者:前進吧-程序員 欄目:開發技術

問題描述

在某些問題背景下,需要確認是否多臺終端在線,也就是會使用我們牛逼的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的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇江市| 平舆县| 汝阳县| 高安市| 大田县| 门源| 历史| 岗巴县| 泗洪县| 钟山县| 兴城市| 麻城市| 白朗县| 徐汇区| 龙川县| 宣威市| 红桥区| 土默特右旗| 化隆| 泾阳县| 镇远县| 灯塔市| 黑河市| 枣阳市| 寻乌县| 新宁县| 大洼县| 蒙自县| 闽侯县| 左云县| 华阴市| 商水县| 新源县| 资源县| 游戏| 陆河县| 海淀区| 南充市| 壶关县| 双牌县| 壤塘县|