我希望能够在Python中执行ping和traceroute,而无需执行相应的shell命令,因此我更喜欢原生的python解决方案。
答案 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”的循环是因为传出数据包的“生存时间”决定了数据包在到期并将错误发送回原始源之前将经过的网络跳数。