当前位置: 首页 > 编程笔记 >

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

薛霄
2023-03-14
本文向大家介绍Python获取网段内ping通IP的方法,包括了Python获取网段内ping通IP的方法的使用技巧和注意事项,需要的朋友参考一下

问题描述

在某些问题背景下,需要确认是否多台终端在线,也就是会使用我们牛逼的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的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍python获取本机外网ip的方法,包括了python获取本机外网ip的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python获取本机外网ip的方法。分享给大家供大家参考。具体如下: python从显示ip地址的网站获取本机外网ip,这段python代码抓取网站上的ip地址信息 希望本文所述对大家的Python程序设计有所帮助。

  • 我在公网服务器上搭建了openvpn-server,在内网的机器192.168.0.106上通过openvpn-client连接上,并且获取到了分配地址:10.8.0.6。 在外网的机器通过openvpn-client连接openvpn-server上,ping 10.8.0.6 是有应答的,说明隧道创建成功了。但是我通过 ping 192.168.0.106 无法应答,这是什么原因? 这是我内网

  • 本文向大家介绍python获取外网ip地址的方法总结,包括了python获取外网ip地址的方法总结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了python获取外网ip地址的方法。分享给大家供大家参考。具体如下: 一、利用脚本引擎库直接获取 二、http库,模式匹配获取 三、whttp库,模式匹配获取 四、API方法 希望本文所述对大家的Python程序设计有所帮助。

  • 本文向大家介绍使用Python获取网段IP个数以及地址清单的方法,包括了使用Python获取网段IP个数以及地址清单的方法的使用技巧和注意事项,需要的朋友参考一下 使用Python获取网段的IP个数以及地址清单需要用到IPy的库,而相应的方法主要就是IP。 写小脚本如下: 运行结果: GreydeMac-mini:01_系统基础信息模块详解 greyzhang$ python ip.py 从上面的

  • 本文向大家介绍python获取外网IP并发邮件的实现方法,包括了python获取外网IP并发邮件的实现方法的使用技巧和注意事项,需要的朋友参考一下 第一步:通过ip138来爬取外网ip 第二步:通过python的smtplib模块和email来发送邮件,具体用法去网上搜索, 下面是代码示例: 以上这篇python获取外网IP并发邮件的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也

  • 本文向大家介绍C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法),包括了C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法)的使用技巧和注意事项,需要的朋友参考一下 今天查看登录日志,发现http_x_forwarded_for获取到的ip地址有些是内网ip地址,有些则是公网和内网ip地址一起获取到,用逗号分隔开,日志截图如下: 之前获取ip地址的C#代码如下: 看来http