以root身份运行python脚本

时间:2014-03-22 06:20:34

标签: python shell root alsa

我有以下脚本:

#!/usr/bin/env python                                                           

import sys                                                                      
import pyttsx                                                                   

def main():                                                                     
        print 'running speech-text.py...'                                       
        engine = pyttsx.init()                                                  
        str = "Hi..."                                    
        if len(sys.argv) > 1:                                                   
                str = sys.argv[1]                                               
        engine.say(str)                                                         
        engine.runAndWait()                                                     

if __name__ == '__main__':                                                      
        main() 

我把它放在/usr/bin/speech-test.py

我还给root了它的可执行权限和所有权:

sudo chown root:root /usr/bin/speech-test.py
sudo chmod 4755 /usr/bin/speech-test.py

但是,如果我以sudo speec-test.py运行,则此脚本只能正常运行。如果我尝试将其作为speech-test.py运行,则会抱怨没有找到一堆ALSA lib文件。

我错过了让我的脚本以root权限运行的东西吗?

3 个答案:

答案 0 :(得分:10)

所以你希望脚本以root运行,即使没有sudo?为此,您需要使用sudo chmod u+s program在脚本上设置 setuid位。但是,出于安全原因,大多数Unix发行版仅允许二进制文件,而不允许脚本。一般来说,做到这一点真的不是一个好主意。

如果要以root身份运行此脚本,则必须以sudo运行。或者,您必须创建一个运行脚本的二进制文件,以便您可以在此二进制包装器上设置setuid位。这个related question解释得更多。

检查有效uid也是一个好主意,如果它不是root,那么就停止运行。为此,请将其添加到顶部附近(感谢@efirvida提示!)

if not os.geteuid() == 0:
    sys.exit("\nOnly root can run this script\n")

原始回答

也许你的用户和root使用不同版本的python,不同的python路径和不同的库集。

试试这个:

which python
sudo which python

如果这两个命令没有给出相同的结果,那么您需要更改用户的设置以使用相同版本的python(具有ALSA库的那个)或硬编码python版本是脚本的第一行。

还可以尝试在脚本中添加print sys.path行,并与您的用户一起运行sudo并进行比较。可能你会得到不同的结果。您可能需要调整用户的PYTHONPATH变量。

没有必要让脚本的所有者为root,并使用sudo运行它。您只需要正确配置pythonPYTHONPATH

答案 1 :(得分:0)

我不确定这是不是一个好方法。我试过它,它在arch linux上工作正常。让我来你的想法。 如果编写脚本以将.py作为不同的系统组执行,则该组可以拥有python解释器并具有指定的根功能。

mkdir roottest && cd roottest
sudo cp /usr/bin/python<ver> ./
sudo groupadd -r rootpython
sudo usermod -a -G rootpython <user>
newgrp rootpython
sudo chown root:rootpython python<ver>
sudo chmod 750 $bin                       #that way a normal user can't rwx the python interpreter and the rootpython group cant write.
sudo setcap <caps> ./python<ver>              #now the group has specify caps allowing it to act like root
sudo getcap ./python<ver>
sudo sh
touch rootfile && echo "original text" > rootfile

以普通用户

打开新提示
newgroup rootpython
cd roottest && ./python<ver>
>> open('rootfile', 'w').write("different text")
sudo cat rootfile

如果使用得当,这种方法比sudo更安全,因为python只能做你所拥有的,并且没有完全控制系统。缺点是必须制作解释器的副本或不允许常规用户的组使用它。不要像这样运行所有的python代码,如果不需要它就是一个很大的漏洞。 cap_net_admin + ep将允许您更改内核var ip_forward,对于上面的示例,您需要cap_dac_override + ep。您还可以创建属于rootpython组的新用户,这样您就可以在不输入新用户密码的情况下使用newgrp rootpython。

答案 2 :(得分:-3)

它的运行权限与运行权限相同。因此,如果你自己运行它,它将没有su特权。你必须这样做sudo