如何利用计算机编程语言实现快速砰一个互联网协议(互联网

2021-06-29 18:11 来源:电子说

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

#!/usr/bin/python3# -*-编码:utf-8-*-导入骨

导入命令行解析模块

导入套接字

导入结构

导入选择

导入时间

ICMP_ECHO_REQUEST=8 #平台特定

默认值_超时=0.1

DEFAULT_COUNT=4class Pinger(对象):

" " " Pings到主机预言的方式" " "

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

self.target _ host=target _主机

self.count=计数

self.timeout=timeout

def do_checksum(self,source_string):

"""验证数据包完整性"""

sum=0

max _ count=(len(source _ string)/2)* 2

计数=0

计数时,《最大计数:

val=source _ string[count 1]* 256 source _ string[count]

总和=总和值

sum=sum0xffffffff

计数=计数2

if max_count《len(source_string)》:

sum=sum顺序(source _ string[len(source _ string)-1])

sum=sum0xffffffff

sum=(sum)《16》(sum0x ffff)

《sum=sum(sum)》16)

答案=~sum

答案=答案0xffff

《答案=答案》8 |(答案《80xff00》

回答

接收失败(自我,短袜,身份,超时):

"""

从套接字接收平.

"""

剩余时间=超时

虽然真实:

start_time=time.time()

可读=select.select([sock],[],[],time_remaining)

time _ waste=(时间。time()-start _ time)

如果可读[0]==[]: #超时

返回

time_received=time.time()

recv_packet,addr=sock.recvfrom(1024)

icmp _ header=recv _ packet[20:28]

类型,代码,校验和,包标识,序列=结构。解包(

“bbHHh”,icmp_header

)

如果数据包标识==标识:

bytes _ In _ double=struct。计算尺寸(“d”)

time _ send=struct。解压缩(“d”,recv _ packet[28:28 bytes _ In _ double])[0]

返回时间_接收时间_发送时间

时间_剩余=时间_剩余-时间_浪费

如果time _ remaining "=0:

返回

拒绝发送(自身、短袜、识别码):

"""

向目标主机发送砰命令

"""

target _ addr=socket。gethostbyname(self。target _ host)

my_checksum=0

#创建一个校验和为0的虚拟海德.

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

bytes _ In _ double=struct。计算尺寸(“d”)

数据=(192字节_In_double) * "Q "

data=struct.pack("d ",time.time())字节(data.encode('utf-8 '))

#获取数据和虚拟报头的校验和。

my_checksum=self.do_checksum(标题数据)

header=struct.pack(

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

)

数据包=报头数据

sock.sendto(数据包,(target_addr,1))

def ping_once(自身):

"""

超时时返回延迟(秒)或无延迟。

"""

icmp=套接字。getprotobyname(" icmp ")

尝试:

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

除了套接字。错误为e:

如果e.errno==1:

#不是超级用户,因此不允许操作

e.msg="ICMP消息只能从根用户进程发送"

引发套接字. error(e.msg)

例外情况除外,如:

打印("异常:% s"%(e))

my _ ID=OS。getpid()0xfffff

self.send_ping(sock,my_ID)

延时=self.receive_pong(sock,my_ID,self.timeout)

sock.close()

返回延迟

def ping(自身):

"""

运行砰过程

"""

对于范围内的我(自我计数):

打印(“平到%s,”。self.target_host,)

尝试:

delay=self.ping_once()

除了socket.gaierror为e:

打印(“平失败。(套接字错误:“% s”)“% e[1])

破裂

如果延迟==无:

打印(“平失败。(在%ssec内超时)" % self.timeout)

else:

延迟=延迟* 1000

打印("在% 0.4 FMS %延迟内获得乒乓")

if __name__=='__main__ ':

活着=[]

host_prefix='192.168.242 '

对于范围内的一(1,255):

host=host_prefix str(i)

pinger=Pinger(target_host=host)

delay=pinger.ping_once()

如果延迟==无:

打印(Ping %s失败,超时2秒" %主机)

else:

打印(% s ping=% s毫秒"%(主机,回合(延迟* 1000,4)))

alive.append(主机)

# time.sleep(0.5)

测试如下:

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

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

延伸 · 阅读