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中处理日期和时间的基本知识点整理汇总
May 22 Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
pycharm创建一个python包方法图解
Apr 10 Python
python读写csv文件的方法
Aug 13 Python
让Django的BooleanField支持字符串形式的输入方式
May 20 Python
Python unittest基本使用方法代码实例
Jun 29 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
浅析Python的命名空间与作用域
Nov 25 Python
Python实现对word文档添加密码去除密码的示例代码
Dec 29 Python
python requests模块的使用示例
Apr 07 Python
解决numpy和torch数据类型转化的问题
May 23 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
我用php+mysql写的留言本
2006/10/09 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
在Django的session中使用User对象的方法
2015/07/23 Python
Python函数的周期性执行实现方法
2016/08/13 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2016年公司新年寄语
2015/08/17 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
Python移位密码、仿射变换解密实例代码
2021/06/27 Python