2013-03-02 66 views
1

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

我设置的用户权限在与开头:

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') 

web应用的端口上绑定80

如果我用这个配置执行我的脚本,web应用程序不能启动并返回一条消息,“无法在80上绑定套接字”。

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

Thansk提前。 P:我试图使用像我的主要功能一样的方法,我用“root”替换了用户“ubuntu”,但它不起作用。

+0

谁想要执行你的文件的用户是在isudoers的列表?如果你的用户在sudoers列表中,你可以改变一些东西。但是,您需要root权限才能更改/修改Init Services。 您是否尝试将您的用户添加到根组? – ManuParra 2013-03-02 23:17:14

+0

相关:[有没有办法让非root进程绑定到Linux上的“特权”端口(<1024)?](http://stackoverflow.com/q/413807/4279) – jfs 2013-03-03 00:33:04

回答

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')  

而且工作。

0

您可以使用两种方法:

  1. 创建其只有工作是运行脚本init.d一个程序,让它setuid root的。 (请确保将其安全地写入!)。主脚本以普通用户权限运行,并调用跑步者。

  2. 程序无法升级自己的权限(除非运行sudo,它至少与方法1一样昂贵),但以root身份运行的程序可能会使自身降级。因此,您可以以root用户身份执行一些操作,然后像普通用户一样将您的uid设置为真实的用户名。但是,如果您需要root权限,最后程序所做的事情,这将不会有任何帮助。

+0

感谢您的回答。问题是,只有root用户可以使用setuid。实际上,如果我使用root用户权限运行我的主脚本,那么在脚本的开始部分,我将setuid与我的自定义用户一起使用。在最后我的脚本中,我打电话给另一个模块,试图设置root用户。那么这个方法,我有一个执行第二个setuid的错误:“OSError:[Errno 1] Operation not permitted” – Matt 2013-03-03 18:03:21

+0

对不起,我不明白你想说什么。但是,是的,只有root可以改变uid,这就是我所解释的。使用我提议的方法之一。 – alexis 2013-03-04 00:16:22

相关问题