当我尝试从Python中找出最佳方法来ping(ICMP)一些东西时,我遇到了以下问题:
答案通常归结为“使用带有根权限的第三方模块”或“使用系统的ping命令并解析输出”。在本地方法中,icmplib和M. Cowles 和 J. Diemer's ping.py明确提到需要根权限,scapy 手册也是如此。
因此,本地发送ICMP ping而不需要特殊权限似乎是不可能的。系统的ping命令可以管理,但它的手册没有解释其如何实现。另一方面,icmp的手册似乎表明这是可能的:
非特权ICMP 可以使用SOCK_DGRAM套接字类型打开ICMP套接字,而无需root权限。 概要如下:能够使用原始ICMP套接字。仅能发送以下类型的ICMP请求消息:ICMP_ECHO、ICMP_TSTAMP或ICMP_MASKREQ。
socket(AF_INET,SOCK_DGRAM,IPPROTO_ICMP)
面向数据报的ICMP套接字提供了可用功能的一个子集。
因此,至少根据icmp,这是被允许的。那么为什么所有的Python工具都无法做到这一点呢?是因为Python工具过于通用,期望对特权套接字的任何操作都需要特权吗?是否可能编写一个可以在没有root特权的情况下执行ping操作的C函数,并使用它来扩展Python?有人这样做了吗?我是否只是误解了问题?
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)
。 - nos