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中用Decorator来简化元编程的教程
Apr 13 Python
在Python中使用元类的教程
Apr 28 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Python实现的随机森林算法与简单总结
Jan 30 Python
python 从csv读数据到mysql的实例
Jun 21 Python
Python实现模拟浏览器请求及会话保持操作示例
Jul 30 Python
pandas ix &iloc &loc的区别
Jan 10 Python
python 如何设置守护进程
Oct 29 Python
Django自带的用户验证系统实现
Dec 18 Python
Flask处理Web表单的实现方法
Jan 31 Python
python中__slots__节约内存的具体做法
Jul 04 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实现的策略模式示例
2019/03/20 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
javascript正则表达式总结
2016/02/29 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
Python实现上下文管理器的方法
2020/08/07 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
力学专业毕业生自荐信
2013/11/17 职场文书
市场安全管理制度
2014/01/26 职场文书
星级党支部申报材料
2014/05/31 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
教师教育教学随笔
2015/08/15 职场文书
python基础之爬虫入门
2021/05/10 Python
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android
Nginx如何配置根据路径转发详解
2022/07/23 Servers