您好我有一个修改应用程序配置文件的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”,但它不起作用。
答案 0 :(得分:0)
您可以使用以下两种方法之一:
创建一个程序,其仅作业是运行init.d
脚本,并使其成为setuid root。 (确保安全地写它!)。主脚本以普通用户权限运行并调用运行程序。
程序无法升级自己的权限(运行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')
这很有效。