一般来说,这是一个很好的答案。 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
的沉默,但如果用户可以成功地改变,则会改变好看。
任何指针?
答案 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
,您就应该做得很好。
更新:,它因其他原因失败了。将start_new_session=True
添加到Popen
会使无权限用户无声地失败并以root身份成功。