在尝试从python中找出ping(ICMP)的最佳方法时,我遇到了以下问题:
答案通常归结为"使用具有root权限的第三方模块"或"使用系统的ping命令并解析输出".在本机方法中,icmplib和M. 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?有没有人这样做过?我只是误解了这个问题吗?
Chr*_*her 13
ping程序安装了setuid root.这允许任何用户使用该程序,并且仍然能够打开原始套接字.
在打开原始套接字后,它通常会丢弃root权限.
您通常需要一个原始套接字才能正确执行ICMP,并且通常会限制原始套接字.所以这根本不是python的错.
关于上面关于ICMP的一点,显然很多实现并不能真正支持这些标志组合.因此,大多数实施可能只是使用他们"知道"的方式在大多数/所有体系结构上工作.
Ale*_*lli 11
以下是/ sbin/ping"以某种方式管理"(在大多数Unix-y系统上):
$ ls -l /sbin/ping
-r-sr-xr-x 1 root wheel 68448 Jan 26 10:00 /sbin/ping
Run Code Online (Sandbox Code Playgroud)
看到?它拥有root
并拥有s
权限中的关键位--setuserid.因此,无论用户运行什么,ping都以root身份运行.
如果您正在使用带有新"非特权ICMP套接字"的BSD内核,那么看看使用该功能从Python进行ping操作需要什么是有趣的(但这对于不太高级内核的任何用户都没有帮助,当然).
我不确定是否可以在似乎不久前已经得到解答的问题中发布一些内容。
我一直在寻找相同的实现,并找到了一种通过 Python 以非 root 权限执行 ICMP 的方法。
python-ping
使用相同的“need-root”方式进行 ping,但遇到了一个错误报告,其中用户建议在调用时更改SOCK_RAW
为:SOCK_DGRAM
sock
http://hg.io/delroth/python-ping/issue/1/icmp-without-root-privilege
开发人员解释说,这将是一种“无法修复”的情况,因为它是 UDP ping。
因为我真的不在乎 ICMP 是否通过 UDP 发出,所以我继续获取代码并进行了建议的更改。
我现在可以在不调用子进程或需要 root 的情况下执行 ping 操作!
再说一次,不确定这么长时间后在这里发帖是否可以,但认为这是一件更好的事情!
小智 5
现代 Linux ping 使用 libcap 并要求 libcap 完成工作。这会检查(capget/set 函数)并管理权限:
linux@jacax:~/WORK$ ldd /bin/ping
linux-gate.so.1 => (0xb77b6000)
libcap.so.2 => /lib/i386-linux-gnu/libcap.so.2 (0xb7796000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e7000)
/lib/ld-linux.so.2 (0xb77b7000)
Run Code Online (Sandbox Code Playgroud)
假设您有一个“myping”程序:
linux@jacax:~/WORK$ getcap ./myping
linux@jacax:~/WORK$ (-> nothing! )
linux@jacax:~/WORK$ setcap cap_net_raw=ep ./myping
unable to set CAP_SETFCAP effective capability: Operation not permitted
linux@jacax:~/WORK$ sudo setcap cap_net_raw=ep ./myping
Run Code Online (Sandbox Code Playgroud)
现在做:
linux@jacax:~/WORK$ getcap ./myping
./ping = cap_net_raw+ep
Run Code Online (Sandbox Code Playgroud)
现在,您的“myping”无需 root 即可运行。也就是说,只要myping
实际上是一个二进制程序即可。如果它是脚本,则必须在脚本解释器上设置此功能。
归档时间: |
|
查看次数: |
23202 次 |
最近记录: |