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中optionParser模块的使用方法实例教程
Aug 29 Python
用Python进行一些简单的自然语言处理的教程
Mar 31 Python
简述Python中的面向对象编程的概念
Apr 27 Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
12个步骤教你理解Python装饰器
Jul 01 Python
python中upper是做什么用的
Jul 20 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
python基于opencv批量生成验证码的示例
Apr 28 Python
Python编程super应用场景及示例解析
Oct 05 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
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
php xfocus防注入资料
2008/04/27 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
Python xlrd excel文件操作代码实例
2020/03/10 Python
Django配置跨域并开发测试接口
2020/11/04 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
临床医学专业学生的自我评价分享
2013/11/21 职场文书
职工运动会感言
2014/02/07 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
元旦晚会开场白
2015/05/29 职场文书