我希望能够在Python内部执行ping和traceroute命令,而无需执行相应的shell命令,因此我更喜欢使用本机Python解决方案。
我希望能够在Python内部执行ping和traceroute命令,而无需执行相应的shell命令,因此我更喜欢使用本机Python解决方案。
如果您不介意使用外部模块,并且不使用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"))
它还使用asyncio的事件循环,因此您可以同时进行多个traceroutes或pings,并在它们完成时处理它们的结果。
这是一个Python脚本,用于对'example.com'进行traceroute:
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'的循环是因为出站数据包的'time-to-live'决定了数据包在到达目标前经过的网络跳数,若该值达到或超过限制则会发回错误信息给源地址。
ICMP Ping是ICMP协议的标准部分。
Traceroute使用ICMP和IP的特性来通过TTL值确定路径。使用TTL值,只要IP/ICMP工作,就可以在各种协议中执行traceroutes,因为正是ICMP TTL超时消息告诉您路径中的跳数。
如果您尝试访问没有可用侦听器的端口,则根据ICMP协议规则,主机应发送ICMP端口不可达消息。
我用Python编写了一个简单的tcptraceroute,不需要root权限http://www.thomas-guettler.de/scripts/tcptraceroute.py.txt
但它无法显示中间跳转的IP地址。但有时它很有用,因为你可以猜测阻止防火墙在路由的开始或结束:要么在一开始,要么在最后。