![从 Python 脚本运行 ICMP ECHO 请求的好方法是什么?](https://linux22.com/image/704225/%E4%BB%8E%20Python%20%E8%84%9A%E6%9C%AC%E8%BF%90%E8%A1%8C%20ICMP%20ECHO%20%E8%AF%B7%E6%B1%82%E7%9A%84%E5%A5%BD%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我正在维护一个应用程序(用 Python 编写),该应用程序轮询大量主机的信息。作为输入,我有一组网络范围。这些范围内的主机并非始终处于运行状态。对于处于停机状态的主机,我遇到了非常长的 TCP 超时。
因此,我nmap
在主应用程序执行之前运行了快速 ping 扫描。
这意味着应用程序依赖于nmap
在系统中安装。 所有这些操作仅用于简单的 ping 检查。
问题是,作为普通用户,我没有足够的权限发送 ICMP ECHO 请求。nmap
和都ping
设置了 setuid 位 IIRC。 因此它们可以作为普通用户运行。
鉴于我编写了自己的应用程序,它也是通过 Python 解释器运行的 Python 脚本,我想知道从那里运行 ICMP 请求的最佳可能性是什么。
在 Python 解释器上设置 setuid 位似乎是一个强有力的解决方案。
请注意,该应用程序以单独的用户身份和 Python 虚拟环境运行(以防万一)。
答案1
您可以授予脚本使用该CAP_NET_RAW
权限的能力,而无需以 root 身份运行它。此权限是使用发送 ping echo 请求所需的 RAW 套接字所必需的。您可以尝试:
$ sudo setcap cap_net_raw+pe <your_script>
说实话,我自己没有尝试过。如果你在由解释器执行的脚本上执行它,似乎不会有效。这里有一篇相关的帖子unix stackexchange。选项包括:
- 设置解释器本身的功能。这可能很糟糕,因为任何人都可以拥有此权限。
- 编写一个仅执行您的脚本的包装器可执行文件,并在此可执行文件上设置所需的功能。