【发布时间】:2010-11-14 10:24:52
【问题描述】:
在试图找出从 python 中 ping (ICMP) 的最佳方法时,我遇到了以下问题:
- How can I perform a ping or traceroute in python, accessing the output as it is produced?
- ping a site in python
- How can I perform a ping or traceroute using native python?
答案通常归结为“使用具有 root 权限的第三方模块”或“使用系统的 ping 命令并解析输出”。在原生方法中,icmplib 和 M. Cowles and J. Diemer's ping.py 明确提到需要 root 权限,scapy manual 也是如此。
因此,从这方面来说,在没有特殊权限的情况下本地发送 ICMP ping 似乎是不可能的。 system ping 命令确实以某种方式管理,但它的手册页没有说明如何进行。另一方面,man page for icmp 似乎说这是可能的:
非特权 ICMP ICMP 套接字可以使用 SOCK_DGRAM 套接字类型打开,而无需 需要root权限。概要如下: 套接字(AF_INET,SOCK_DGRAM,IPPROTO_ICMP) 面向数据报的 ICMP 套接字提供了可用功能的子集 能够原始 ICMP 套接字。只有以下的 IMCP 请求消息 可以发送类型:ICMP_ECHO、ICMP_TSTAMP 或 ICMP_MASKREQ。因此,至少根据 icmp,这似乎是允许的。那么为什么所有的python工具都无法做到这一点呢? python 工具是否过于通用并期望特权套接字上的任何工作都具有特权?是否可以在 C 中编写一个无需 root 权限即可 ping 的 ping 函数,并以此扩展 python?有人做过吗?我是不是误解了这个问题?
【问题讨论】:
-
您使用的是什么操作系统? Recent Linux kernels 和 Mac OS X 已知具有非特权 ICMP 套接字。您找到的手册页来自 OS X,它应该可以工作。我已经成功使用了非特权纯 Python ping program,它适用于 Linux(内核设置更改),但可能需要在 OS X 上进行一些调整。
-
对于 Linux,请参见此处 stackoverflow.com/questions/8290046/icmp-sockets-linux/… ,您需要一个特殊的 sysctl 才能使用
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)