在python中的sudo renice

时间:2017-06-15 19:30:09

标签: python linux sudo renice

一般来说,这是一个很好的答案。 Linux不允许非特权用户降低PID的优点,而以root身份运行是他们自己的蠕虫。

也就是说,这是我的具体内容:我有一个用户帐户可以管理一些具有sudo无密码renice权限的进程以及它使用的其他一些命令。我还有一个脚本,是该系统上所有用户的通用入口点。此脚本既可以运行常规用户程序,也可以运行特殊帐户管理的进程。因此,当使用特定选项运行时,脚本应renice(如果可以),但如果不能,则应以静默方式失败。

我为此得到的代码如下:

subprocess.Popen(["sudo", "renice", "-20", str(process.pid)],
#                shell = True,
                 stdout = subprocess.DEVNULL,
                 stderr = subprocess.STDOUT)

如果我已shell = True注释掉,该过程会获得新的好处,但如果我作为非特权用户运行,则sudo会启动其密码提示并破坏我的终端输出。击键变得不可见,一切都变得愚蠢。如果我取消注释shell = True,我得不到终端输出。但是,即使我以root身份运行它,该过程也不会改变它的好处。

损坏的终端输出可能是我正在使用的终端模拟器(没有尝试过另一个)但我想合并这些行为。无论如何,来自sudo的沉默,但如果用户可以成功地改变,则会改变好看。

任何指针?

1 个答案:

答案 0 :(得分:2)

我认为这是因为sudo requires a TTY,即使不需要密码也是如此。

尝试提供一个:

import os
import pty
import subprocess

master, slave = pty.openpty()
p = subprocess.Popen(
    ["sudo", "id", "-a"],
    stdin=slave, stdout=slave, stderr=slave
)
os.close(slave)

output = os.read(master, 1026)
os.close(master)
print(output)

上面的代码应该打印uid=0(root) gid=0(root) groups=0(root)之类的内容。如果是,请将id替换为renice,删除不必要的os.read,您就应该做得很好。

在OP的情况下

更新:,它因其他原因失败了。将start_new_session=True添加到Popen会使无权限用户无声地失败并以root身份成功。