我希望能够在 Python 中执行 ping 和 traceroute,而无需执行相应的 shell 命令,因此我更喜欢原生 python 解决方案。
7 回答
如果您不介意使用外部模块而不使用 UDP 或 TCP,scapy是一个简单的解决方案:
from scapy.all import *
target = ["192.168.1.254"]
result, unans = traceroute(target,l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="www.google.com")))
或者你可以使用 tcp 版本
from scapy.all import *
target = ["192.168.1.254"]
result, unans = traceroute(target,maxttl=32)
请注意,您必须以 root 身份运行 scapy 才能执行这些任务,否则您将获得:
socket.error: [Errno 1] Operation not permitted
Webb 库在执行各种与 Web 相关的提取方面非常方便……并且可以通过它轻松完成 ping 和 traceroute。只需包含您要跟踪路由到的 URL:
import webb
webb.traceroute("your-web-page-url")
如果您希望将 traceroute 日志自动存储到文本文件,请使用以下命令:
webb.traceroute("your-web-page-url",'file-name.txt')
类似地,可以使用以下代码行获取 URl(服务器)的 IP 地址:
print(webb.get_ip("your-web-page-url"))
希望能帮助到你!
mtrpacket包可用于发送网络探测,它可以执行 ping 或 traceroute。由于它使用 mtr 命令行工具的后端,因此它不需要您的脚本以 root 身份运行。
它还使用 asyncio 的事件循环,因此您可以同时拥有多个正在进行的跟踪路由或 ping,并在它们完成时处理它们的结果。
这是一个跟踪路由到“example.com”的 Python 脚本:
import asyncio
import mtrpacket
async def trace():
async with mtrpacket.MtrPacket() as mtr:
for ttl in range(1, 256):
result = await mtr.probe('example.com', ttl=ttl)
print(result)
if result.success:
break
asyncio.get_event_loop().run_until_complete(trace())
使用带有“ttl”的循环是因为传出数据包的“生存时间”决定了数据包在到期之前将经过的网络跳数并将错误发送回原始源。
你可能想看看scapy包。它是 python 网络工具的瑞士军刀。
ICMP Ping 作为 ICMP 协议的一部分是标准的。
Traceroute 使用 ICMP 和 IP 的功能通过生存时间值确定路径。使用 TTL 值,只要 IP/ICMP 工作,您就可以在各种协议中执行跟踪路由,因为它是 ICMP TTL EXceeded 消息告诉您有关路径中的跃点。
如果您尝试访问没有可用侦听器的端口,根据 ICMP 协议规则,主机应该发送 ICMP Port Unreachable 消息。
我在 python 中写了一个简单的 tcptraceroute,它不需要 root 权限http://www.thomas-guettler.de/scripts/tcptraceroute.py.txt
但它无法显示中间跃点的 IP 地址。但有时它很有用,因为您可以猜测阻塞防火墙的位置:在路由的开头或结尾。