python实现ping命令小程序


Posted in Python onDecember 28, 2020

ping的原理是发送一个ICMP请求包,然后根据目的地址的应答包来判断是否能够和这个主机进行通信。
我们使用python实现,借助于scapy来进行编写程序。

from scapy.all import *
import time,struct,random
# 编写ping一个包的函数。
def ping_one(dst = '36.152.44.95',ttl_no = 64,id_no = 345,seq_no = 5):
  start_time = time.time()
  # 将时间转换为二进制序列。
  time_to_bytes = struct.pack('>d',start_time)
  # 进行发送ICMP包,发送出去一个,收回来一个。
  ping_one_result = sr1(IP(dst = dst,ttl = ttl_no)/ICMP(seq = seq_no,id = id_no)/time_to_bytes, timeout = 1, verbose=False)
  # print(ping_one_result.show())
  # 判断收回来的包是不是ICMP的应答包,和序列号是否相同。
  try:
    if ping_one_result.getlayer('ICMP').type == 0 and ping_one_result.getlayer('ICMP').seq == seq_no:
      # print('进行解析包')
      # 提取IP头部中的源IP地址,也就是我们ping的IP地址。
      reply_src_IP = ping_one_result.getlayer('IP').src
      # 提取序列号。
      reply_icmp_seq = ping_one_result.getlayer('ICMP').seq
      # 提取ttl
      reply_icmp_ttl = ping_one_result.getlayer('IP').ttl
      # 数据长度等于 数据长度(Raw) + 垫片长度(Padding) + 8字节(ICMP头部长度)
      if ping_one_result.getlayer(Raw) != None:
        Raw_length = len(ping_one_result.getlayer(Raw).load)
      else:
        Raw_length = 0
      if ping_one_result.getlayer(Padding) != None:
        Padding_length = len(ping_one_result.getlayer(Padding).load)
      else:
        Padding_length = 0
      # 计算数据长度。
      reply_data_length = Raw_length + Padding_length + 8
      # 取出数据部分,这里的数据部分是我们发送ICMP请求包的时候填入的时间。
      reply_data = ping_one_result.getlayer(Raw).load
      # 定义我们收包的时间。
      end_time = time.time()
      # 将数据时间部分进行转换。
      reply_data_time = struct.unpack('>d',reply_data)
      # 然后打印出转换后的类型。
      # print(type(reply_data_time))
      # print(reply_data_time)
      time_to_pass_ms = (end_time - reply_data_time[0]) * 1000
      # (接收时间 - 发送时间) * 1000为毫秒数为消耗时间的毫秒数
      # print(time_to_pass_ms)
      return reply_data_length,reply_src_IP,reply_icmp_seq,reply_icmp_ttl,time_to_pass_ms
  except Exception as e:
    # 打印出错误。
    # print('e', e)
    # 匹配错误是否为NoneType类型。
    if re.match('.*NoneType.*', str(e)):
      print('错误了')
      # 如果没有回应,就返回None
      return None
def ping(dst = '36.152.44.95'):
  # 这里其实可以取进程号的,但是我们用随机生成一个数字模拟一下。
  id_no = random.randint(0,65535)
  # print(id_no)
  # 然后进行发送5个数据包。
  for i in range(1,6):
    # 调用ping一个包函数,入参为目的需要ping的IP地址。ttl,id,和序列号。seq。
    ping_result = ping_one(dst,64,id_no,i)
    if ping_result != None:
      print('%d bytes from %s: icmp_seq=%d ttl=%d time=%4.2f ms' % (ping_result[0], ping_result[1], ping_result[2], ping_result[3], ping_result[4]))
    else:
      print('.',end = '',flush = True)
    # 这里我们暂停一秒。
    time.sleep(1)

if __name__ == "__main__":
  ping('36.152.44.95')

但现在为止,我们的ping小程序就用python实现了,接下来就可以用wireshark工具抓包来看一下,进行ping百度的地址。

python实现ping命令小程序

以上就是python实现ping命令小程序的详细内容,更多关于python ping命令的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python基础教程之字典操作详解
Mar 25 Python
Python语法快速入门指南
Oct 12 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
python3爬取数据至mysql的方法
Jun 26 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
基于Python解密仿射密码
Oct 21 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
python numpy中setdiff1d的用法说明
Apr 22 Python
如何用python 操作zookeeper
Dec 28 #Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 #Python
Python用Jira库来操作Jira
Dec 28 #Python
python性能测试工具locust的使用
Dec 28 #Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 #Python
python字典与json转换的方法总结
Dec 28 #Python
python字典按照value排序方法
Dec 28 #Python
You might like
十天学会php之第二天
2006/10/09 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
vue百度地图 + 定位的详解
2019/05/13 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
Python中的zip函数使用示例
2015/01/29 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
详解Django的CSRF认证实现
2018/10/09 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
python队列Queue的详解
2019/05/10 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
小学生班会演讲稿
2014/01/09 职场文书
留学推荐信写作指南
2014/01/25 职场文书
工程资料员岗位职责
2014/03/10 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
超市工作总结范文2014
2014/12/19 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL