Django和root进程

时间:2011-01-20 15:27:25

标签: python django django-views root ping

在我的Django项目中,我需要能够使用ICMP ping检查LAN上的主机是否 up 。我找到了this SO question,它解答了如何在Python和this SO question中解决问题,它链接到解释如何使用sodoers文件的资源。

设置

Device模型为LAN上的主机存储IP地址,并在向DB添加新的Device实例后(通过自定义视图,而不是管理员)我设想检查以查看如果设备使用对API公开该功能的AJAX调用来响应ping。

问题

但是(来自第一个SO问题中建议的库的文档字符串)“请注意,ICMP消息只能从以root身份运行的进程发送。”

我不想以root用户身份运行Django,因为这是不好的做法。但是,此过程的一部分(发送和ICMP ping)需要以root身份运行。如果使用Django视图,我希望发送一个ping数据包来测试主机的活跃性,那么Django本身需要以root身份运行,因为这是调用ping的过程。

解决方案

这些是我能想到的解决方案,我的问题是有没有更好的方法只能以root身份执行Django项目的选择部分,而不是:

  1. 以root身份运行Django(请不要!)
  2. 在队列中放置一个“ping请求”,另一个进程 - 以root身份运行 - 可以定期检查并完成。也许像celery
  3. 有没有更简单的方法?

    我想要像“Django以root身份运行”这样的库,这可能吗?

3 个答案:

答案 0 :(得分:7)

绝对不行,不要以root身份运行Django代码!

我会以root身份运行守护进程(用Python编写,为什么不运行),然后在Django实例和守护进程之间运行IPC。只要您确定要验证内容并正确处理它(例如,使用带有数组等的subprocess.call)并且只传入数据(而不是执行命令),它应该没问题。

以下是使用web.py

的示例客户端和服务器

服务器:http://gist.github.com/788639 客户:http://gist.github.com/788658

你需要安装webpy.org,但无论如何它都值得拥有。如果您可以将IP(或主机名)硬连接到服务器并删除参数,那就更好了。

答案 1 :(得分:2)

你的操作系统是什么?您可以编写一个程序来执行您想要的参数,并将其粘贴到sudoers文件中,并授予django用户以root身份运行它的权限。

的/ etc / sudoers的

答案 2 :(得分:1)

我不知道你在使用什么类型的系统,但是在我遇到的任何一个盒子上,一个人不必是root用户来运行命令行ping程序(它有suid位设置,因此必要时变为root。所以你可以调用它。它的开销略高,但与网络延迟相比可能微不足道。