我有以下脚本:
#!/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 权限运行?
所以您希望脚本以
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
即可。
我不太确定这是否是一个好方法。我试过了,在 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 。
我不知道,但用
#!/usr/bin/env python
替换 #!/bin/python
对我有用。
你应该以 root 身份运行 须藤-i 或者 苏
它的运行权限与运行它的权限相同。因此,如果您以自己的身份运行它,它将不具有 su 权限。你必须这么做
sudo
。