以 root 身份运行 python 脚本

问题描述 投票:0回答:5

我有以下脚本:

#!/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 权限运行?

python shell root alsa
5个回答
13
投票

所以您希望脚本以

root
的形式运行,即使没有
sudo
?为此,您需要使用 sudo chmod u+s program 在脚本上设置
setuid 位
。然而,出于安全原因,大多数 Unix 发行版仅允许对二进制文件执行此操作,而不允许对脚本执行此操作。一般来说,这样做确实不是一个好主意。

如果您想以 root 身份运行此脚本,则必须以

sudo
身份运行。或者,您必须创建一个运行脚本的二进制文件,以便您可以在此二进制包装器上设置 setuid 位。这个相关问题解释了更多。

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

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

原答案

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

试试这个:

command -v python
sudo command -v python

如果这两个命令没有给出相同的结果,那么您需要更改用户的设置以使用相同版本的

python
(具有 ALSA 库的版本),或者在第一行硬编码 python 版本脚本的。

还可以尝试在脚本中添加

print sys.path
行,并与您的用户和
sudo
一起运行并进行比较。也许你会得到不同的结果。您可能需要调整用户的
PYTHONPATH
变量。

不必将脚本的所有者设置为 root,并使用

sudo
运行它。您只需正确配置
python
PYTHONPATH
即可。


0
投票

我不太确定这是否是一个好方法。我试过了,在 arch linux 上运行得很好。让我看看你的想法。 如果您编写一个脚本来作为不同的系统组执行 .py,则该组可以拥有 python 解释器并具有指定的 root 功能。

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 将允许您更改内核变量 ip_forward,对于上面的示例,您需要 cap_dac_override+ep。您还可以创建一个属于 rootpython 组的新用户,这样您就不能在不输入新用户密码的情况下直接 newgrp rootpython 。


0
投票

我不知道,但用

#!/usr/bin/env python
替换
#!/bin/python
对我有用。


0
投票

你应该以 root 身份运行 须藤-i 或者 苏


-4
投票

它的运行权限与运行它的权限相同。因此,如果您以自己的身份运行它,它将不具有 su 权限。你必须这么做

sudo

© www.soinside.com 2019 - 2024. All rights reserved.