0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用Python實(shí)現(xiàn)快速Ping一個(gè)IP網(wǎng)段地址?

馬哥Linux運(yùn)維 ? 來(lái)源:散盡浮華 2021 ? 作者:散盡浮華 2021 ? 2021-06-29 15:59 ? 次閱讀

ping 命令是我們檢查網(wǎng)絡(luò)中最常用的命令,作為網(wǎng)絡(luò)人員,基本上每天都會(huì)用到,可以很好地幫助我們分析和判定網(wǎng)絡(luò)故障;如果有 10 設(shè)備,100 臺(tái)設(shè)備,1000 臺(tái)設(shè)備怎么辦?一個(gè)個(gè) ping 過(guò)去人都要瘋掉了,這種情況在大型網(wǎng)絡(luò)中我們有可能遇到,那怎么辦呢?我們今天來(lái)看下如何用 python 來(lái)實(shí)現(xiàn)批量 ping 測(cè)試主機(jī)。代碼如下:

#!/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 失敗,超時(shí)2秒” % host)

else:

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

alive.append(host)

# time.sleep(0.5)

測(cè)試如下:

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

原文鏈接:www.yjsec.com/2020/11/07
編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 主機(jī)
    +關(guān)注

    關(guān)注

    0

    文章

    982

    瀏覽量

    35008
  • Ping
    +關(guān)注

    關(guān)注

    0

    文章

    69

    瀏覽量

    15931
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68236
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84376

原文標(biāo)題:用 Python 實(shí)現(xiàn)快速 Ping 一個(gè) IP 網(wǎng)段地址!

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    網(wǎng)段IP耦合器實(shí)現(xiàn)工業(yè)設(shè)備快速接入物聯(lián)網(wǎng)平臺(tái)

    在現(xiàn)代工業(yè)自動(dòng)化領(lǐng)域,隨著設(shè)備數(shù)量的不斷增加和網(wǎng)絡(luò)結(jié)構(gòu)的日益復(fù)雜,跨網(wǎng)段通信成為了個(gè)亟需解決的問(wèn)題。設(shè)備間的通信往往受限于其IP地址所在的
    的頭像 發(fā)表于 09-27 10:52 ?198次閱讀
    跨<b class='flag-5'>網(wǎng)段</b><b class='flag-5'>IP</b>耦合器<b class='flag-5'>實(shí)現(xiàn)</b>工業(yè)設(shè)備<b class='flag-5'>快速</b>接入物聯(lián)網(wǎng)平臺(tái)

    工業(yè)NAT網(wǎng)關(guān)實(shí)現(xiàn)不同網(wǎng)段IP轉(zhuǎn)換成同一網(wǎng)段

    的無(wú)縫通信,讓不同網(wǎng)段IP的設(shè)備能夠相互訪問(wèn),物通博聯(lián)提供基于工業(yè)NAT網(wǎng)關(guān)的解決方案,能夠?qū)⒉煌?b class='flag-5'>網(wǎng)段的IP地址轉(zhuǎn)換成同
    的頭像 發(fā)表于 09-23 15:24 ?192次閱讀
    工業(yè)NAT網(wǎng)關(guān)<b class='flag-5'>實(shí)現(xiàn)</b>不同<b class='flag-5'>網(wǎng)段</b><b class='flag-5'>IP</b>轉(zhuǎn)換成同<b class='flag-5'>一網(wǎng)段</b>

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

    Python中,直接查詢IP地址的地理位置或詳細(xì)信息(如所屬國(guó)家、城市等)通常需要依賴外部API服務(wù),因?yàn)?b class='flag-5'>Python標(biāo)準(zhǔn)庫(kù)本身不提供直接查詢IP
    發(fā)表于 08-28 11:55

    Ping測(cè)試在不同網(wǎng)段通信中的準(zhǔn)確性

    不同網(wǎng)段之間的通信順暢與否能影響網(wǎng)絡(luò)的整體性能和業(yè)務(wù)的正常運(yùn)行。Ping 測(cè)試作為種常用的網(wǎng)絡(luò)診斷工具,被廣泛用于檢測(cè)網(wǎng)絡(luò)連接的可達(dá)性。然而,在沒(méi)有三層交換路由功能的網(wǎng)絡(luò)中,跨網(wǎng)段
    的頭像 發(fā)表于 07-31 16:15 ?237次閱讀

    網(wǎng)段 IP 地址通信故障分析

    本文深入探討了在網(wǎng)絡(luò)環(huán)境中,跨網(wǎng)段 IP 地址通信故障的原因,重點(diǎn)闡述了路由設(shè)置不正確所引發(fā)的無(wú)法正常通信問(wèn)題。通過(guò)實(shí)際案例分析和理論研究,詳細(xì)介紹了故障的表現(xiàn)、影響及有效的解決策略,為保障網(wǎng)絡(luò)的穩(wěn)定高效通信提供了有力的理論支持
    的頭像 發(fā)表于 07-29 13:52 ?229次閱讀
    跨<b class='flag-5'>網(wǎng)段</b> <b class='flag-5'>IP</b> <b class='flag-5'>地址</b>通信故障分析

    NAT網(wǎng)關(guān)如何修改PLC的IP地址實(shí)現(xiàn)網(wǎng)段訪問(wèn)

    IP無(wú)法修改給企業(yè)帶來(lái)越多越多困擾。 對(duì)此,物通博聯(lián)提供基于NAT(網(wǎng)段隔離器)的解決方案,適用于生產(chǎn)網(wǎng)絡(luò)對(duì) PLC、HMI、CNC、DCS、MES等網(wǎng)絡(luò)通訊和數(shù)據(jù)采集,兼有跨網(wǎng)段隔離和IP
    的頭像 發(fā)表于 07-18 17:38 ?341次閱讀
    NAT網(wǎng)關(guān)如何修改PLC的<b class='flag-5'>IP</b><b class='flag-5'>地址</b><b class='flag-5'>實(shí)現(xiàn)</b>跨<b class='flag-5'>網(wǎng)段</b>訪問(wèn)

    個(gè)路由器ip地址沖突怎么解決

    當(dāng)兩個(gè)路由器的IP地址發(fā)生沖突時(shí),會(huì)導(dǎo)致網(wǎng)絡(luò)連接不穩(wěn)定或無(wú)法連接。以下是解決兩個(gè)路由器IP地址
    的頭像 發(fā)表于 07-09 11:35 ?4729次閱讀

    NAT網(wǎng)關(guān)實(shí)現(xiàn)工業(yè)設(shè)備網(wǎng)段隔離,解決IP沖突問(wèn)題

    在制造業(yè)工廠中,存在大量已經(jīng)提前布設(shè)好的通信網(wǎng)絡(luò),通過(guò)實(shí)現(xiàn)設(shè)備聯(lián)網(wǎng)數(shù)據(jù)采集,可以實(shí)現(xiàn)設(shè)備的遠(yuǎn)程監(jiān)控與遠(yuǎn)程控制,從而為高效率生產(chǎn)帶來(lái)各種智能應(yīng)用。但在新設(shè)備聯(lián)網(wǎng)時(shí),往往會(huì)遇見(jiàn)IP地址段沖
    的頭像 發(fā)表于 06-20 14:11 ?490次閱讀
    NAT網(wǎng)關(guān)<b class='flag-5'>實(shí)現(xiàn)</b>工業(yè)設(shè)備<b class='flag-5'>網(wǎng)段</b>隔離,解決<b class='flag-5'>IP</b>沖突問(wèn)題

    網(wǎng)段IP耦合器是什么?跨網(wǎng)段IP耦合器的功能作用

    通過(guò)別的網(wǎng)段訪問(wèn),網(wǎng)絡(luò)耦合器能夠解決跨網(wǎng)段訪問(wèn)的問(wèn)題。 車間多個(gè)設(shè)備,如果具有相同的IP地址,則可以統(tǒng)成同
    的頭像 發(fā)表于 04-18 09:25 ?389次閱讀

    網(wǎng)段隔離器如何實(shí)現(xiàn)IP隔離轉(zhuǎn)換配置

    推出具備IP隔離和NAT轉(zhuǎn)換功能的網(wǎng)段隔離器,適用于生產(chǎn)網(wǎng)絡(luò)對(duì) PLC、HMI、CNC、DCS、MES等網(wǎng)絡(luò)通訊和數(shù)據(jù)采集,兼有跨網(wǎng)段隔離和IP轉(zhuǎn)換的功能。比如車間多個(gè)設(shè)備,如果有不同
    的頭像 發(fā)表于 03-29 10:54 ?623次閱讀
    <b class='flag-5'>網(wǎng)段</b>隔離器如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>IP</b>隔離轉(zhuǎn)換配置

    通過(guò)網(wǎng)段隔離器實(shí)現(xiàn)NAT轉(zhuǎn)換與跨網(wǎng)段訪問(wèn)

    需要我們采用種方法來(lái)解決中間的這段空窗期。 這時(shí),NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)發(fā)揮出重要的作用,將內(nèi)部網(wǎng)絡(luò)中的私有IP地址轉(zhuǎn)換為公共IP
    的頭像 發(fā)表于 02-18 17:28 ?400次閱讀
    通過(guò)<b class='flag-5'>網(wǎng)段</b>隔離器<b class='flag-5'>實(shí)現(xiàn)</b>NAT轉(zhuǎn)換與跨<b class='flag-5'>網(wǎng)段</b>訪問(wèn)

    ping不存在的地址會(huì)咋樣?ping和誰(shuí)都不在個(gè)網(wǎng)段IP又會(huì)如何?

    ping不存在的地址會(huì)咋樣?ping和誰(shuí)都不在個(gè)網(wǎng)段IP
    的頭像 發(fā)表于 02-04 11:21 ?1294次閱讀

    PLC跨網(wǎng)段通信如何解決(如何通過(guò)以太網(wǎng)實(shí)現(xiàn)網(wǎng)段通信)

    網(wǎng)段通信是指不在同一網(wǎng)段IP地址的設(shè)備之間的通信。比如我們通過(guò)互聯(lián)網(wǎng)給遠(yuǎn)在海外的PLC設(shè)備進(jìn)行遠(yuǎn)程調(diào)試,又比如我們?cè)谵k公室利用局域網(wǎng)監(jiān)控
    的頭像 發(fā)表于 01-29 17:34 ?1228次閱讀
    PLC跨<b class='flag-5'>網(wǎng)段</b>通信如何解決(如何通過(guò)以太網(wǎng)<b class='flag-5'>實(shí)現(xiàn)</b>跨<b class='flag-5'>網(wǎng)段</b>通信)

    什么是子網(wǎng)掩碼?如何根據(jù)掩碼來(lái)確定ip地址網(wǎng)段?

    什么是子網(wǎng)掩碼?如何根據(jù)掩碼來(lái)確定ip地址網(wǎng)段?如何判斷兩個(gè)IP地址是否在同
    的頭像 發(fā)表于 12-07 09:40 ?1996次閱讀

    多個(gè)相同IP設(shè)備通過(guò)網(wǎng)段隔離器實(shí)現(xiàn)不同IP的訪問(wèn)映射

    )來(lái)解決這問(wèn)題,它允許多個(gè)設(shè)備在內(nèi)部網(wǎng)絡(luò)上共享單個(gè)公共IP地址,并實(shí)現(xiàn)外網(wǎng)的跨網(wǎng)段訪問(wèn)。 網(wǎng)段
    的頭像 發(fā)表于 11-15 17:21 ?714次閱讀
    多個(gè)相同<b class='flag-5'>IP</b>設(shè)備通過(guò)<b class='flag-5'>網(wǎng)段</b>隔離器<b class='flag-5'>實(shí)現(xiàn)</b>不同<b class='flag-5'>IP</b>的訪問(wèn)映射