我正在尝试使用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应用程序root权限,以便我可以绕过sudo密码提示。
答案 0 :(得分:3)
如果您确实需要以root身份运行应用程序的一部分,则可以将其重写为守护程序,并按照this answer中的建议从主Django应用程序与其进行通信。如果下面的替代方案不符合您的要求,我只会推荐它。
替代sudo iptables-restore < iptables.rules.txt
要简单得多,只需告诉sudo不要通过将此密码添加到 / 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())