我正在维护一个应用程序(用Python编写),它轮询大量主机的信息。 作为input,我有一组networking范围。 并非所有这些范围内的主机总是在运行。 对于正在closures的主机,我遇到了难以置信的TCP超时。
为此,我在主应用程序执行之前运行nmap快速ping扫描。
这意味着应用程序依赖于系统上安装的nmap 。 所有只是一个简单的ping检查。
问题是,作为一个普通的用户,我没有足够的权限发送ICMP ECHO请求。 nmap和ping都有setuid位IIRC。 所以这些可以像普通用户一样运行。
考虑到我编写自己的应用程序,它也是一个通过Python解释器运行的Python脚本,我不知道从那里运行ICMP请求的最佳方法是什么。
在Python解释器上设置setuid位看起来像是一个大锤解决scheme。
请注意,应用程序作为单独的用户和Python虚拟环境运行(如果这将有所作为)。
您可以为您的脚本提供使用CAP_NET_RAW权限而不以root身份运行的权限。 需要此特权才能使用发送ping回应请求所需的RAW套接字。 你可以试试:
$ sudo setcap cap_net_raw+pe <your_script>
说实话,我没有自己尝试。 如果你使用一个由解释器执行的脚本,它似乎不会有效。 这里是关于unix stackexchange的相关文章。 选项是: