在试图从python中找出进行ping(ICMP)的最佳方法时,我遇到了以下问题:
答案通常归结为“使用具有根权限的第三方模块”或“使用系统的ping命令并解析输出”。本土的方法,icmplib
因此,从这方面来说,在没有特权的情况下,本地发送ICMP请求似乎是不可能的。Systemping命令确实以某种方式进行管理,但它的手册页没有说明如何进行管理。大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函数,它可以在没有根权限的情况下进行ping,并用它扩展python?有人做过这个吗?我刚才有没有误解这个问题?
发布于 2018-03-15 13:34:22
ping程序安装setuid根。这允许任何用户使用该程序,并且仍然能够打开原始套接字。
打开原始套接字后,通常会删除根特权。
您通常需要一个原始套接字才能正确执行ICMP,而原始套接字通常是受限的。所以这根本不是python的错。
关于上面关于ICMP的一点,显然许多实现并不真正支持这些标志的组合。因此,很可能大多数的实现只是使用他们“知道”的方式在大多数/所有架构上工作。
发布于 2018-03-15 15:03:15
下面是/sbin/ping如何“以某种方式管理”(在大多数Unix-y系统上):
$ ls -l /sbin/ping
-r-sr-xr-x 1 root wheel 68448 Jan 26 10:00 /sbin/ping
看到没?它是由root
有关键的s
权限-setuserid中的位。所以,不管哪个用户正在运行它,ping以根形式运行
如果您使用的是一个带有新的“非特权ICMP套接字”的BSD内核,那么很有兴趣了解如何使用该功能从Python中进行ping(当然,这不会对处于较低级别内核上的任何用户有所帮助)。
https://stackoverflow.com/questions/-100007628
复制相似问题