2013-04-21 89 views
2

我想建立一个使用django的API,它应该使用POST参数来改变iptables。我正在使用django 1.4,djangorestframework,python-iptables。我面临的问题是python-iptables需要root权限才能更改iptables规则。我可以通过执行$ sudo python来更改iptables规则,并且可以从python shell中更改这些规则。另外,我可以使用iptdump模块更改这些规则,该模块接受iptables参数并创建那些稍后可以保存在文件(iptables.rules.txt)中的规则,并使用fabric的local('sudo iptables-restore < iptables.rules.txt')。但是这总是会提示用户输入root密码。有没有一种方法可以让django应用程序根权限,以便我可以绕过sudo密码提示。给django应用程序根权限?

回答

3

如果您确实需要应用程序的一部分以root用户身份运行,您可以将其重写为守护进程,并按照this answer中的建议与主Django应用程序进行通信。如果下面的替代方案不符合您的要求,我只会推荐它。

替代sudo iptables-restore < iptables.rules.txt要简单得多,只需添加以下内容到的/ etc/sudoers文件文件告诉须藤不要求输入密码只是此命令:

djangouser ALL=(ALL) NOPASSWD: /sbin/iptables-restore 

哪里djangouser是用户Django进程正在运行。

编辑:可避免直接发送新的iptables的iptables-restore过程写中间文件:

import iptdump 
import subprocess 

ipt = iptdump.Iptables() 
proc = subprocess.Popen(['sudo', '/sbin/iptables-restore'], 
         stdin=subprocess.PIPE) 
proc.communicate(ipt.dump()) 
+0

嘿感谢这个工作,但有什么办法,我可以跳过sudo的密码提示。 – Saad 2013-04-21 16:28:50

+1

@Saad **/etc/sudoers **中的行应该防止密码提示,您确定代码是以sudoers中指定的用户身份运行的吗? – 2013-04-21 17:37:36

+0

是的,我终于完成了,谢谢 – Saad 2013-04-22 07:36:37