以root身份运行python脚本

Posted

技术标签:

【中文标题】以root身份运行python脚本【英文标题】:Running python script as root 【发布时间】:2014-04-29 17:33:53 【问题描述】:

我有以下脚本:

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

【问题讨论】:

问题可能出在 hashbang 中的env,但我需要对其进行测试。你称它为./speech-test.py,而不是python speech-test.py?因为以后会以用户权限运行python。 只是speech-test.py 没有./ 你不能在 linux 上使用 SUID 脚本。如果需要,请编写二进制启动器或使用 nopasswd sudo。任何以 hashbang 开头的可执行文件都是脚本。 TIL: ***.com/questions/18698976/… + faqs.org/faqs/unix-faq/faq/part4/section-7.html 谢谢@x3al 如果您不想使用 nopasswd sudo,那么您可以使用类似 cx_Freeze 的 Python 脚本创建二进制可执行文件。 【参考方案1】:

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

【讨论】:

如果您设置了粘性位,则不是这样,就像 OP 尝试的那样。 哦,是的,我忘了...对不起【参考方案2】:

所以您希望脚本以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 路径和不同的库集。

试试这个:

command -v python
sudo command -v python

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

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

不必将脚本的所有者设为 root 并使用 sudo 运行它。只需正确配置pythonPYTHONPATH即可。

【讨论】:

which 已更改为 command -v。使用command -v 而不是which 有几个原因。如果您不想更改,请还原。另见How to check if command exists in a shell script? 和How to check if a program exists from a Bash script? 除非包是全局安装的(sudo 可以访问),否则这是行不通的,而且有一种趋势是让包保持在本地。【参考方案3】:

我不确定这是否是一个好方法。我试过了,它在 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_dac_override+ep。你也可以创建一个属于rootpython组的newuser,这样你就不能不输入newuser的密码就只newgrp rootpython。

【讨论】:

【参考方案4】:

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

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于以root身份运行python脚本的主要内容,如果未能解决你的问题,请参考以下文章

在pycharm中以管理员身份运行/调试脚本(How to run / debug programs as root in Pycharm)

在启动问题上以root身份运行Python

以 root 身份运行结构脚本

以root身份在脚本中间运行命令[重复]

以 root 身份运行 Node.js 脚本的 Elastic beanstalk

确保脚本以root用户身份运行