如何使用原生Python执行ping或traceroute?

10

我希望能够在Python内部执行ping和traceroute命令,而无需执行相应的shell命令,因此我更喜欢使用本机Python解决方案。

7个回答

13

如果您不介意使用外部模块,并且不使用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

感谢您的帖子。我需要以下方面的帮助。我无法使用traceroute函数。我已经安装了scapy v2.4并在Python程序中导入了它。从scapy.all import *。我还需要在每个跳跃点打印时间。您能帮忙吗? - Hussain ali
根据您使用的Python版本,您可以pip安装所需的特定scapy版本。请查看此链接:https://scapy.readthedocs.io/en/latest/installation.html - George Adams

3
在安全方面,以root身份运行解释器通常会受到反对(当然,您需要具有root权限才能访问ping和traceroute所需的“原始”套接字!),但如果您没有问题,这并不难。例如,此帖子(已失效?)或此帖子提供了一个可行的ping方法,Jeremy Hylton的旧页面仍具有可用于ICMP(ping和traceroute)的底层代码,尽管它是针对非常旧的Python版本编写的,并且需要进行一些修改才能与现代版本兼容--但是,我提供给您的两个URL中都包含所有概念!

3
可以通过UDP数据包而非原始套接字或ICMP来进行ping和traceroute,许多工具都这样做。 - Glenn Maynard
@Glenn,这与实际的ping和traceroute命令不兼容:如果你的对等方支持UDP回显,这些伪ping和-traceroute版本将起作用,但是,没有ICMP,你就超出了标准范围,你的检查可能会失败(除非对等方遵守超出标准的规定),而标准的基于ICMP的方法则可以正常工作。 - Alex Martelli
谢谢。我想我会回去尝试使用shell命令来完成这个任务。关于如何在Python中执行ping或traceroute并访问输出的新问题在这里:https://dev59.com/lkjSa4cB1Zd3GeqPF4BY - Dave Forgac
UDP traceroute和ICMP一样标准。就像ICMP一样,它是标准TTL字段的自然副作用。Ping更棘手 - 许多安全系统会简单地丢弃未打开端口的数据包,如果恰好是一个打开的端口 - 你不能保证它不是 - 那么它可能不起作用。 - Glenn Maynard
6
现在这两个链接都失效了,这使得此链接的回答没有任何用处。 - Peilonrayz
显示剩余2条评论

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

希望这能帮助到您!

3
Webb图书馆多年未更新,且Python3中存在明显的漏洞未得到解决,不建议在生产代码中使用。 - Sherd
在看到上面的评论后,我仔细地看了一下...你在使用webb之前也应该这样做。无论如何,它(webb)声称没有依赖关系,全部自包含。但似乎非常依赖于某些操作系统和底层操作系统安装的程序,例如tracert。 - tc0nn

3
mtrpacket包可用于发送网络探测,能够执行ping或traceroute。由于它使用mtr命令行工具的后端,所以不需要将您的脚本运行为root。

它还使用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'决定了数据包在到达目标前经过的网络跳数,若该值达到或超过限制则会发回错误信息给源地址。


我可以确认mtrpacket非常棒! - Tom Greenwood

0

ICMP Ping是ICMP协议的标准部分。

Traceroute使用ICMP和IP的特性来通过TTL值确定路径。使用TTL值,只要IP/ICMP工作,就可以在各种协议中执行traceroutes,因为正是ICMP TTL超时消息告诉您路径中的跳数。

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


0

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

但它无法显示中间跳转的IP地址。但有时它很有用,因为你可以猜测阻止防火墙在路由的开始或结束:要么在一开始,要么在最后。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接