我正在维护一个应用程序(用 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。选项包括:
- 设置解释器本身的功能。这可能很糟糕,因为任何人都可以拥有此权限。
- 编写一个仅执行您的脚本的包装器可执行文件,并在此可执行文件上设置所需的功能。