python更改权限以重新启动外部应用程序

时间:2013-03-02 23:08:56

标签: python privileges

您好我有一个修改应用程序配置文件的python脚本。要应用此功能,我需要重新启动应用程序。为此,我调用init.d文件。但是当我执行此操作时,我需要成为root用户,否则应用程序无法在端口上绑定她。另外,我不想用root的权限执行我所有的python脚本。如何使用root权限执行重新启动,然后将其删除。

我在开头设置了用户权限:

if __name__ == "__main__":
    uid = pwd.getpwnam('ubuntu')[2]
    os.setuid(uid)
    app.run(host='0.0.0.0', port=5001, debug=True)

在我的脚本结束时我需要执行:

commands.getoutput('/etc/init.d/webapplication restart')

webapplication绑定在端口80上。

如果我使用此配置执行我的脚本,webapplication无法启动并返回消息,“无法在80上绑定套接字”。

有什么想法吗?有一个干净的解决方案,只能在python脚本下在Debian服务器上执行具有root权限的一个外部命令?

Thansk提前。

P.S:我尝试使用与我的main函数相同的方法,并且用“root”替换了用户“ubuntu”,但它不起作用。

2 个答案:

答案 0 :(得分:0)

您可以使用以下两种方法之一:

  1. 创建一个程序,其作业是运行init.d脚本,并使其成为setuid root。 (确保安全地写它!)。主脚本以普通用户权限运行并调用运行程序。

  2. 程序无法升级自己的权限(运行sudo除外,这至少与方法1一样昂贵),但以root身份运行的程序可以自行降级。因此,您可以以root身份执行某些步骤,然后通过将uid设置为真实uid继续作为普通用户。如果您需要程序执行的 last 事项的root权限,这将没有任何帮助。

答案 1 :(得分:0)

为了实现我的目标,我已经使用了sudo解决方案。要在debian服务器上执行此操作:

apt-get install sudo
Edit: /etc/sudoers
Add line: my_user(uses for the setuid) ALL = NOPASSWD : /etc/init.d/webapplication
And in my python script:
commands.getoutput('sudo /etc/init.d/webapplication restart')    

这很有效。