如何使用本机python执行ping或traceroute?

时间:2009-07-20 05:02:00

标签: python ping traceroute

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

7 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

以root身份运行解释程序通常会因为安全原因而不受欢迎(当然,您需要拥有root权限才能访问ping和traceroute的ICMP规范所需的“原始”socked!),但如果您没有问题并不困难 - 例如,this post提供了可行的ping,而Jeremy Hylton的旧page仍然可用于ICMP的底层代码(ping和traceroute),尽管它是为非常老的Python编写的版本,并需要一个小小的改头换面以​​现代感 - 但是,在我给你的两个网址中都有概念!

答案 2 :(得分:3)

Webb Library在执行各种与Web相关的提取时非常方便......并且ping和traceroute可以通过它轻松完成。只需将您要跟踪的网址包含在:

即可
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 :(得分:0)

您可能想查看scapy包。它是蟒蛇网络工具的瑞士军刀。

答案 4 :(得分:0)

ICMP Ping是ICMP协议的标准配置。

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

mtrpacket package可用于发送网络探针,该探针可以执行ping或跟踪路由。由于它使用了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”的循环是因为传出数据包的“生存时间”决定了数据包在到期并将错误发送回原始源之前将经过的网络跳数。