Python ICMP 诊断库 icmplib

ICMPLIB

icmplib 是 Python 中 ICMP 协议的全新现代实现。

特征

  • 🌳即用型: icmplib 提供即用型函数,例如最受欢迎的函数:ping、multiping和traceroute。详尽的文档也可以帮助您入门。
  • 💎现代:这个库使用 Python 3.7+ 提供的最新机制,并且完全面向对象。
  • 🚀快速:每个类和函数都经过精心设计和优化,以提供最佳性能。一些函数也是异步的,如async_ping和async_multiping函数。您可以在几秒钟内 ping 遍世界!
  • ⚡强大:无需 root 权限即可使用该库,设置 ICMP 数据包的流量类,自定义其有效负载,发送广播请求等等!
  • 🔩 Evolutive:ICMPv4使用和套接字轻松构建您自己的类和函数ICMPv6。
  • 🔥 IPv6 无缝集成:使用 IPv6 的方式与使用 IPv4 的方式相同。
  • 🍺跨平台:针对 Linux、macOS 和 Windows 进行了优化。该库会自动管理每个系统的特性。
  • 🤘无依赖: icmplib 是 ICMP 协议的纯 Python 实现。它不依赖任何外部依赖。

安装

  • 安装 icmplib

安装 icmplib 的推荐方法是使用pip3:

$ pip3 install icmplib
  • 导入基本功能
from icmplib import ping, multiping, traceroute, resolve
  • 导入异步函数
from icmplib import async_ping, async_multiping, async_resolve
  • 导入套接字(高级)
from icmplib import ICMPv4Socket, ICMPv6Socket, AsyncSocket, ICMPRequest, ICMPReply
  • 导入例外
from icmplib import ICMPLibError, NameLookupError, ICMPSocketError
from icmplib import SocketAddressError, SocketPermissionError
from icmplib import SocketUnavailableError, SocketBroadcastError, TimeoutExceeded
from icmplib import ICMPError, DestinationUnreachable, TimeExceeded

功能

ping

ping(address, count=4, interval=1, timeout=2, id=None, source=None, family=None, privileged=True, **kwargs)

路由追踪 - traceroute

确定到目标​​主机的路由。

互联网是一个庞大而复杂的网络硬件集合,通过网关连接在一起。跟踪数据包所遵循的路由可能很困难。此功能使用 IP 协议生存时间字段,并尝试从通往某个主机的路径上的每个网关引出 ICMP 超时响应。

该功能需要root权限才能运行。

traceroute(address, count=2, interval=0.05, timeout=2, first_hop=1, max_hops=30, fast=False, id=None, source=None, family=None, **kwargs)

异步 ping

>>> import asyncio
>>> from icmplib import async_ping

>>> async def is_alive(address):
...     host = await async_ping(address, count=10, interval=0.2)
...     return host.is_alive

>>> asyncio.run(is_alive('1.1.1.1'))
True
>>> import asyncio
>>> from icmplib import async_multiping

>>> async def are_alive(*addresses):
...     hosts = await async_multiping(addresses)
...     
...     for host in hosts:
...         if not host.is_alive:
...             return False
...
...     return True

>>> asyncio.run(are_alive('10.0.0.5', '127.0.0.1', '::1'))
False

参考文献

苏ICP备19018690号-1