代码之家  ›  专栏  ›  技术社区  ›  Dave Forgac Eli Bendersky

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

  •  5
  • Dave Forgac Eli Bendersky  · 技术社区  · 16 年前

    我希望能够从python中执行ping和traceroute,而不必执行相应的shell命令,所以我更喜欢原生的python解决方案。

    7 回复  |  直到 7 年前
        1
  •  4
  •   Alex Martelli    16 年前

    出于安全考虑,将解释器作为根目录运行通常是不受欢迎的(当然,您需要根目录权限才能访问ping和traceroute的ICMP规范所需的“原始”socketed!)但是如果你对此没有任何问题,这并不难——例如, this post 打了一个可行的球,杰里米·希尔顿老了 page 虽然它是为非常老的Python版本编写的,并且需要一点改版才能与现代版本一起闪耀——但是,在我给你的两个URL中,所有的概念都在那里!

        2
  •  8
  •   akaihola dnlcrl    10 年前

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

    请注意,为了能够执行这些任务,您必须以根用户身份运行scapy,否则将得到:

    socket.error: [Errno 1] Operation not permitted
    
        3
  •  3
  •   hnvasa    10 年前

    这个 Webb Library 在执行各种与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"))
    

    希望它有帮助!

        4
  •  0
  •   Autoplectic    16 年前

    你可能想看看 scapy 包裹。它是瑞士军刀的网络工具为巨蟒。

        5
  •  0
  •   Dougie    16 年前

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

    traceroute使用ICMP和IP的特性通过生存时间值来确定路径。使用TTL值,您可以在各种协议中执行跟踪路由,只要IP/ICMP工作,因为正是ICMP TTL超出的消息告诉您路径中的跃点。

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

        6
  •  0
  •   guettli    13 年前

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

    但不能显示中间跳的IP地址。但有时它是有用的,因为您可以猜测阻塞防火墙在哪里:在路由的开始或结束。

        7
  •  0
  •   mkimball    7 年前

    这个 mtrpacket package 可用于发送网络探测器,可执行ping或跟踪路由。因为它使用mtr命令行工具的后端,所以不需要将脚本作为根运行。

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

    推荐文章