Django和根进程
在我的Django项目中,我需要能够使用ICMP ping检查LAN上的主机是否已 启动
。我找到了这个SO问题,该问题回答了如何ping
Python中的某些内容,并且这个SO问题链接到了解释如何使用sodoers文件的资源。
那个设定
一种Device
模型在LAN上存储主机的IP地址,然后将新Device
实例添加到数据库(通过自定义视图,而不是管理员)后,我设想检查设备是否通过AJAX调用来响应ping。公开此功能的API。
问题
但是(从第一个SO问题中建议的库的文档字符串中得出)“请注意,只能从以root用户身份运行的进程发送ICMP消息。”
我不希望以root用户身份运行Django,因为这是不好的做法。但是,该过程的这一部分(发送和ICMP
ping)需要以root用户身份运行。如果使用Django视图,我希望发送ping数据包以测试主机的活动性,则Django本身必须以root用户身份运行,因为这是调用ping的过程。
解决方案
这些是我能想到的解决方案, 我的问题是,除了这些方法以外,还有没有其他更好的方法可以仅以root身份执行Django项目的选定部分 :
- 以root身份运行Django(请不要!)
- 将“ ping请求”放入队列中,其他进程(以root用户身份运行)可以定期检查和执行。也许像芹菜。
有没有更简单的方法?
我想要类似“以root身份运行Django”的库,这可能吗?
-
绝对没有办法,不要以root身份运行Django代码!
我将以根用户身份运行守护程序(用Python编写,为什么不这样做),然后在Django实例和守护程序之间运行IPC。只要您确定验证内容并正确处理它(例如,
subprocess.call
与数组等配合使用)并且仅传递数据(而不是执行命令),就可以了。这是使用web.py的示例客户端和服务器
服务器:http://gist.github.com/788639
客户端:http://gist.github.com/788658您需要安装webpy.org,但是还是值得的。如果您可以将IP(或主机名)硬连线到服务器并删除参数,那就更好了。