如何利用计算机编程语言实现快速砰一个互联网协议(互联网
砰命令是我们检查网络中最常用的命令,作为网络人员,基本上每天都会用到,可以很好地帮助我们分析和判定网络故障;如果有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)
测试如下:
原文链接:www.yjsec.com/2020/11/07编辑:jq
延伸 · 阅读
- 2021-06-29 18:11物质转移通道左右球状星团多星族的形成机制
- 2021-06-29 18:11全国两会聚焦汽车智能网联加快产业“新基建”
- 2021-06-29 18:11分析协议层注册到内核并成为套接字的过程
- 2021-06-29 18:11通过财报看理想车的“丰满度”和“骨感”
- 2021-06-29 18:11智能家居的采用推动了Wi-Fi路由器市场的增长
- 2021-06-29 18:11处于退坡期的新能源汽车将再次迎来上升期