0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用Python实现快速Ping一个IP网段地址?

马哥Linux运维 来源:散尽浮华 2021 作者:散尽浮华 2021 2021-06-29 15:59 次阅读

ping 命令是我们检查网络中最常用的命令,作为网络人员,基本上每天都会用到,可以很好地帮助我们分析和判定网络故障;如果有 10 设备,100 台设备,1000 台设备怎么办?一个个 ping 过去人都要疯掉了,这种情况在大型网络中我们有可能遇到,那怎么办呢?我们今天来看下如何用 python 来实现批量 ping 测试主机。代码如下:

#!/usr/bin/python3# -*- coding: utf-8 -*-import os

import argparse

import socket

import struct

import select

import time

ICMP_ECHO_REQUEST = 8 # Platform specific

DEFAULT_TIMEOUT = 0.1

DEFAULT_COUNT = 4class Pinger(object):

“”“ Pings to a host -- the Pythonic way”“”

def __init__(self, target_host, count=DEFAULT_COUNT, timeout=DEFAULT_TIMEOUT):

self.target_host = target_host

self.count = count

self.timeout = timeout

def do_checksum(self, source_string):

“”“ Verify the packet integritity ”“”

sum = 0

max_count = (len(source_string)/2)*2

count = 0

while count 《 max_count:

val = source_string[count + 1]*256 + source_string[count]

sum = sum + val

sum = sum & 0xffffffff

count = count + 2

if max_count《len(source_string):

sum = sum + ord(source_string[len(source_string) - 1])

sum = sum & 0xffffffff

sum = (sum 》》 16) + (sum & 0xffff)

sum = sum + (sum 》》 16)

answer = ~sum

answer = answer & 0xffff

answer = answer 》》 8 | (answer 《《 8 & 0xff00)

return answer

def receive_pong(self, sock, ID, timeout):

“”“

Receive ping from the socket.

”“”

time_remaining = timeout

while True:

start_time = time.time()

readable = select.select([sock], [], [], time_remaining)

time_spent = (time.time() - start_time)

if readable[0] == []: # Timeout

return

time_received = time.time()

recv_packet, addr = sock.recvfrom(1024)

icmp_header = recv_packet[20:28]

type, code, checksum, packet_ID, sequence = struct.unpack(

“bbHHh”, icmp_header

if packet_ID == ID:

bytes_In_double = struct.calcsize(“d”)

time_sent = struct.unpack(“d”, recv_packet[28:28 + bytes_In_double])[0]

return time_received - time_sent

time_remaining = time_remaining - time_spent

if time_remaining 《= 0:

return

def send_ping(self, sock, ID):

“”“

Send ping to the target host

”“”

target_addr = socket.gethostbyname(self.target_host)

my_checksum = 0

# Create a dummy heder with a 0 checksum.

header = struct.pack(“bbHHh”, ICMP_ECHO_REQUEST, 0, my_checksum, ID, 1)

bytes_In_double = struct.calcsize(“d”)

data = (192 - bytes_In_double) * “Q”

data = struct.pack(“d”, time.time()) + bytes(data.encode(‘utf-8’))

# Get the checksum on the data and the dummy header.

my_checksum = self.do_checksum(header + data)

header = struct.pack(

“bbHHh”, ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), ID, 1

packet = header + data

sock.sendto(packet, (target_addr, 1))

def ping_once(self):

“”“

Returns the delay (in seconds) or none on timeout.

”“”

icmp = socket.getprotobyname(“icmp”)

try:

sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)

except socket.error as e:

if e.errno == 1:

# Not superuser, so operation not permitted

e.msg += “ICMP messages can only be sent from root user processes”

raise socket.error(e.msg)

except Exception as e:

print(“Exception: %s” %(e))

my_ID = os.getpid() & 0xFFFF

self.send_ping(sock, my_ID)

delay = self.receive_pong(sock, my_ID, self.timeout)

sock.close()

return delay

def ping(self):

“”“

Run the ping process

”“”

for i in range(self.count):

print (“Ping to %s.。。” % self.target_host,)

try:

delay = self.ping_once()

except socket.gaierror as e:

print (“Ping failed. (socket error: ‘%s’)” % e[1])

break

if delay == None:

print (“Ping failed. (timeout within %ssec.)” % self.timeout)

else:

delay = delay * 1000

print(“Get pong in %0.4fms” % delay)

if __name__ == ‘__main__’:

alive = []

host_prefix = ‘192.168.242.’

for i in range(1, 255):

host = host_prefix + str(i)

pinger = Pinger(target_host=host)

delay = pinger.ping_once()

if delay == None:

print(“Ping %s 失败,超时2秒” % host)

else:

print(“ping %s = %s ms” % (host, round(delay * 1000, 4)))

alive.append(host)

# time.sleep(0.5)

测试如下:

8b6ab878-d895-11eb-9e57-12bb97331649.gif

原文链接:www.yjsec.com/2020/11/07
编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 主机
    +关注

    关注

    0

    文章

    993

    浏览量

    35114
  • Ping
    +关注

    关注

    0

    文章

    69

    浏览量

    15974
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68524
  • python
    +关注

    关注

    56

    文章

    4792

    浏览量

    84627

原文标题:用 Python 实现快速 Ping 一个 IP 网段地址!

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    无需修改设备IP实现网段访问的解决方案

    数字化、网络化改造造成困扰。 在有组网设备存在IP地址端冲突且无法修改网段时,可通过物通博联网段耦合器(NAT网关),将车间生产设备的IP
    的头像 发表于 12-09 17:16 135次阅读
    无需修改设备<b class='flag-5'>IP</b><b class='flag-5'>实现</b>跨<b class='flag-5'>网段</b>访问的解决方案

    网段IP耦合器实现工业设备快速接入物联网平台

    在现代工业自动化领域,随着设备数量的不断增加和网络结构的日益复杂,跨网段通信成为了亟需解决的问题。设备间的通信往往受限于其IP地址所在的
    的头像 发表于 09-27 10:52 261次阅读
    跨<b class='flag-5'>网段</b><b class='flag-5'>IP</b>耦合器<b class='flag-5'>实现</b>工业设备<b class='flag-5'>快速</b>接入物联网平台

    工业NAT网关实现不同网段IP转换成同一网段

    的无缝通信,让不同网段IP的设备能够相互访问,物通博联提供基于工业NAT网关的解决方案,能够将不同网段IP地址转换成同
    的头像 发表于 09-23 15:24 248次阅读
    工业NAT网关<b class='flag-5'>实现</b>不同<b class='flag-5'>网段</b><b class='flag-5'>IP</b>转换成同<b class='flag-5'>一网段</b>

    如何利用python和API查询IP地址

    Python中,直接查询IP地址的地理位置或详细信息(如所属国家、城市等)通常需要依赖外部API服务,因为Python标准库本身不提供直接查询IP
    发表于 08-28 11:55

    使用Python进行Ping测试

    在网络工程中,Ping测试是种常用的网络诊断工具,用于检查网络连接的可达性和响应时间。Ping测试通过向目标主机发送ICMP(Internet Control Message Protocol
    的头像 发表于 08-12 17:56 494次阅读
    使用<b class='flag-5'>Python</b>进行<b class='flag-5'>Ping</b>测试

    Ping测试在不同网段通信中的准确性

    不同网段之间的通信顺畅与否能影响网络的整体性能和业务的正常运行。Ping 测试作为种常用的网络诊断工具,被广泛用于检测网络连接的可达性。然而,在没有三层交换路由功能的网络中,跨网段
    的头像 发表于 07-31 16:15 305次阅读

    网段 IP 地址通信故障分析

    本文深入探讨了在网络环境中,跨网段 IP 地址通信故障的原因,重点阐述了路由设置不正确所引发的无法正常通信问题。通过实际案例分析和理论研究,详细介绍了故障的表现、影响及有效的解决策略,为保障网络的稳定高效通信提供了有力的理论支持
    的头像 发表于 07-29 13:52 298次阅读
    跨<b class='flag-5'>网段</b> <b class='flag-5'>IP</b> <b class='flag-5'>地址</b>通信故障分析

    NAT网关如何修改PLC的IP地址实现网段访问

    IP无法修改给企业带来越多越多困扰。 对此,物通博联提供基于NAT(网段隔离器)的解决方案,适用于生产网络对 PLC、HMI、CNC、DCS、MES等网络通讯和数据采集,兼有跨网段隔离和IP
    的头像 发表于 07-18 17:38 414次阅读
    NAT网关如何修改PLC的<b class='flag-5'>IP</b><b class='flag-5'>地址</b><b class='flag-5'>实现</b>跨<b class='flag-5'>网段</b>访问

    路由器ip地址冲突怎么解决

    当两路由器的IP地址发生冲突时,会导致网络连接不稳定或无法连接。以下是解决两路由器IP地址
    的头像 发表于 07-09 11:35 5729次阅读

    NAT网关实现工业设备网段隔离,解决IP冲突问题

    在制造业工厂中,存在大量已经提前布设好的通信网络,通过实现设备联网数据采集,可以实现设备的远程监控与远程控制,从而为高效率生产带来各种智能应用。但在新设备联网时,往往会遇见IP地址段冲
    的头像 发表于 06-20 14:11 553次阅读
    NAT网关<b class='flag-5'>实现</b>工业设备<b class='flag-5'>网段</b>隔离,解决<b class='flag-5'>IP</b>冲突问题

    网段IP耦合器是什么?跨网段IP耦合器的功能作用

    通过别的网段访问,网络耦合器能够解决跨网段访问的问题。 车间多个设备,如果具有相同的IP地址,则可以统成同
    的头像 发表于 04-18 09:25 443次阅读

    网段隔离器如何实现IP隔离转换配置

    推出具备IP隔离和NAT转换功能的网段隔离器,适用于生产网络对 PLC、HMI、CNC、DCS、MES等网络通讯和数据采集,兼有跨网段隔离和IP转换的功能。比如车间多个设备,如果有不同
    的头像 发表于 03-29 10:54 691次阅读
    <b class='flag-5'>网段</b>隔离器如何<b class='flag-5'>实现</b><b class='flag-5'>IP</b>隔离转换配置

    通过网段隔离器实现NAT转换与跨网段访问

    需要我们采用种方法来解决中间的这段空窗期。 这时,NAT(网络地址转换)发挥出重要的作用,将内部网络中的私有IP地址转换为公共IP
    的头像 发表于 02-18 17:28 438次阅读
    通过<b class='flag-5'>网段</b>隔离器<b class='flag-5'>实现</b>NAT转换与跨<b class='flag-5'>网段</b>访问

    ping不存在的地址会咋样?ping和谁都不在网段IP又会如何?

    ping不存在的地址会咋样?ping和谁都不在网段IP
    的头像 发表于 02-04 11:21 1483次阅读

    PLC跨网段通信如何解决(如何通过以太网实现网段通信)

    网段通信是指不在同一网段IP地址的设备之间的通信。比如我们通过互联网给远在海外的PLC设备进行远程调试,又比如我们在办公室利用局域网监控
    的头像 发表于 01-29 17:34 1343次阅读
    PLC跨<b class='flag-5'>网段</b>通信如何解决(如何通过以太网<b class='flag-5'>实现</b>跨<b class='flag-5'>网段</b>通信)