9

我希望能够在 Python 中执行 ping 和 traceroute,而无需执行相应的 shell 命令,因此我更喜欢原生 python 解决方案。

4

7 回答 7

11

如果您不介意使用外部模块而不使用 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
于 2011-08-10T22:57:19.300 回答
3

出于安全原因,通常不赞成以 root 身份运行解释器(当然,您需要具有 root 权限才能访问 ICMP ping 和 traceroute 规范所需的“原始”资源!),但如果您对此没有任何问题这并不难——例如,这篇文章给出了一个可行的 ping,Jeremy Hylton 的旧页面具有仍然可用的 ICMP 底层代码(ping 和 traceroute),尽管它是为非常旧的 Python 版本编写的,需要稍微改头换面才能与现代版本相映成趣那些——但是,这些概念都在那里,在我给你的两个 URL 中!

于 2009-07-20T05:06:49.240 回答
3

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"))

希望能帮助到你!

于 2015-07-27T02:15:35.270 回答
2

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”的循环是因为传出数据包的“生存时间”决定了数据包在到期之前将经过的网络跳数并将错误发送回原始源。

于 2019-02-13T23:57:09.537 回答
0

你可能想看看scapy包。它是 python 网络工具的瑞士军刀。

于 2009-07-20T07:42:16.273 回答
0

ICMP Ping 作为 ICMP 协议的一部分是标准的。

Traceroute 使用 ICMP 和 IP 的功能通过生存时间值确定路径。使用 TTL 值,只要 IP/ICMP 工作,您就可以在各种协议中执行跟踪路由,因为它是 ICMP TTL EXceeded 消息告诉您有关路径中的跃点。

如果您尝试访问没有可用侦听器的端口,根据 ICMP 协议规则,主机应该发送 ICMP Port Unreachable 消息。

于 2010-06-04T13:16:41.463 回答
0

我在 python 中写了一个简单的 tcptraceroute,它不需要 root 权限http://www.thomas-guettler.de/scripts/tcptraceroute.py.txt

但它无法显示中间跃点的 IP 地址。但有时它很有用,因为您可以猜测阻塞防火墙的位置:在路由的开头或结尾。

于 2013-03-27T08:33:47.333 回答