以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
运行它。只需正确配置python
和PYTHONPATH
即可。
【讨论】:
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)