我编写了一些代码来通过python执行iptables command
。这是代码:
import subprocess
def check_output(*popenargs, **kwargs):
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be overridden.')
process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
output, unused_err = process.communicate()
retcode = process.poll()
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise subprocess.CalledProcessError(retcode, cmd)
return output
def accept_port(port):
try:
cmd = r"iptables -A INPUT -p tcp --dport {0} -j ACCEPT && iptables -A OUTPUT -p tcp --sport {0} -j ACCEPT".format(port)
output = check_output(cmd, shell=True)
return True
except Exception:
return False
if __name__ == "__main__":
accept_port(1234)
当我以root用户运行代码时,一切顺利。但是当我使用用户apache
执行上述代码时,它失败了。如果我想要由用户apache
执行代码而不是root
,我该怎么办?我认为iptables command
必须由root user
执行。有人可以提一些建议吗?非常感谢!
答案 0 :(得分:2)
不要这样做。您的服务器现在可以利用。
apache用户不是一般用途,它的设计和限制由Apache进程使用。
相反,使用您的Web应用程序触发器或计划任务,并使不同的进程作为不同的非root用户从此队列中读取任务并执行它们。
使用sudo
,您只能允许这个单独的用户执行某些命令。这样,您的apache用户无权运行命令,并且您正在利用操作系统的安全角色来隔离操作。
为某些命令仅限root用户有一个原因:)
答案 1 :(得分:0)
您可以使用允许任何用户执行某些sudo
命令的root
命令,查看here以了解如何配置sudo
供您使用。
如果您对root
处决有进一步的问题,我建议您尝试https://unix.stackexchange.com/。