shell 以root用户身份运行python脚本

5jdjgkvh  于 2023-10-23  发布在  Shell
关注(0)|答案(5)|浏览(182)

我有以下脚本:

#!/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权限运行,我是否缺少了什么?

eulz3vhy

eulz3vhy1#

所以你想让脚本以root运行,即使没有sudo?为此,您需要使用sudo chmod u+s program在脚本上设置 *setuid位 *。然而,大多数Unix发行版只允许二进制文件这样做,而不允许脚本这样做,这是出于安全原因。总的来说,这样做真的不是一个好主意。
如果你想以root身份运行这个脚本,你必须以sudo身份运行。或者,您必须创建一个运行脚本的二进制文件,这样您就可以在这个二进制 Package 器上设置setuid位。related question解释更多。
检查有效的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运行它。您只需要正确配置pythonPYTHONPATH

xt0899hw

xt0899hw2#

我不确定这是不是一个好方法。我试过了,它在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将允许您更改内核变量ip_forward,对于上面的示例,您需要cap_default_override+ep。你也可以创建一个属于rootpython组的newuser,这样你就不能只newgrp rootpython而不输入newuser的密码。

j9per5c4

j9per5c43#

Idk,但取代#!/usr/bin/env python#!/bin/python为我工作。

3z6pesqy

3z6pesqy4#

您应该以root sudo -isu身份运行

t0ybt7op

t0ybt7op5#

它的运行权限与运行它的人相同。所以如果你以自己的身份运行它,它就没有su特权。你必须做sudo

相关问题