1

您好我有一个修改应用程序配置文件的 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 权限的外部命令?

提前谢谢。

PS:我尝试使用与我的主要功能相同的方法,我已将用户“ubuntu”替换为“root”,但它不起作用。

4

2 回答 2

0

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

  1. 创建一个程序,其唯一的工作就是运行init.d脚本,并将其设为 setuid root。(确保安全地写入它!)。主脚本以普通用户权限运行并调用运行器。

  2. 程序没有办法提升自己的权限(除了运行sudo,这至少与方法 1 一样昂贵),但以 root 身份运行的程序可以自行降级。因此,您可以以 root 身份执行一些步骤,然后通过将您的 uid 设置为真实的 uid 以普通用户身份继续。但是,如果您需要 root 权限来执行程序的最后一件事,这将无济于事。

于 2013-03-03T00:08:02.610 回答
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')    

那行得通。

于 2013-03-04T13:58:19.843 回答