相关疑难解决方法(0)

python非特权ICMP

在尝试从python中找出ping(ICMP)的最佳方法时,我遇到了以下问题:

答案通常归结为"使用具有root权限的第三方模块"或"使用系统的ping命令并解析输出".在本机方法中,icmplibM. Cowles以及J. Diemer的ping.py明确提到了root权限的需要,scapy 手册也是如此.

所以从那个方面来看,原本发送没有特权的ICMP ping似乎是不可能的.系统ping命令确实以某种方式进行管理,但其手册页并未阐明如何操作.另一方面,icmp手册页似乎表明它是可能的:

Non-privileged ICMP
     ICMP sockets can be opened with the SOCK_DGRAM socket type without
     requiring root privileges. The synopsis is the following:

     socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)

     Datagram oriented ICMP sockets offer a subset of the functionality avail-
     able to raw ICMP sockets. Only IMCP request messages of the following
     types can be sent: ICMP_ECHO, ICMP_TSTAMP or ICMP_MASKREQ.

所以看起来,至少根据icmp,它是允许的.那么为什么所有的python工具都无法做到这一点呢?python工具是否过于笼统,并期望特权套接字上的任何工作都具有特权?是否有可能在C中编写ping函数,可以在没有root权限的情况下ping,并用此扩展python?有没有人这样做过?我只是误解了这个问题吗?

python ping icmp

21
推荐指数
4
解决办法
2万
查看次数

如何在python中执行ping或traceroute,在生成时访问输出?

早些时候,我问过这个问题:

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

但是因为python没有以root身份运行,所以它无法打开在本机python中执行ping/traceroute所需的原始ICMP套接字.

这让我回到使用系统的ping/traceroute shell命令.这个问题有几个使用该subprocess模块的例子似乎运作良好:

用Python ping一个站点?

我还有一个要求:我需要能够在生成时访问输出(例如,对于长时间运行的traceroute.)

上面的示例都运行shell命令,然后只有在命令完成后才能访问完整的输出.有没有办法在生成时访问命令输出?

编辑:根据Alex Martelli的回答,这是有效的:

import pexpect

child = pexpect.spawn('ping -c 5 www.google.com')

while 1:
        line = child.readline()
        if not line: break
        print line,
Run Code Online (Sandbox Code Playgroud)

python ping traceroute

3
推荐指数
2
解决办法
1万
查看次数

标签 统计

ping ×2

python ×2

icmp ×1

traceroute ×1