【发布时间】:2017-06-15 19:30:08
【问题描述】:
一般来说,这是一个很好回答的问题。 Linux 不允许非特权用户降低 PID 的友好度,并且以 root 身份运行东西是它自己的蠕虫罐头。
也就是说,这是我的具体情况:我有一个用户帐户,它管理着几个进程,这些进程对 renice 和它使用的一些其他命令具有无密码 sudo 权限。我还有一个脚本,它是该系统上所有用户的公共入口点。该脚本既可以运行常规用户程序,也可以运行特殊帐户管理的进程。因此,脚本在使用特定选项运行时,如果可以,应该renice,但如果不能,则静默失败。
我得到的代码如下:
subprocess.Popen(["sudo", "renice", "-20", str(process.pid)],
# shell = True,
stdout = subprocess.DEVNULL,
stderr = subprocess.STDOUT)
如果我将 shell = True 注释掉,该进程将获得新的好处,但如果我以非特权用户身份运行,sudo 会退出其密码提示并破坏我的终端输出。击键变得不可见,一切都变得愚蠢。如果我取消注释 shell = True,我将没有终端输出。但是,即使我以 root 身份运行,该过程也不会改变它的优点。
损坏的终端输出很可能归结为我正在使用的终端模拟器(还没有尝试过另一个),但我想合并这些行为。无论如何,sudo 保持沉默,但如果用户可以成功 sudo,那就太好了。
任何指针?
【问题讨论】:
-
我认为(但不确定)这是因为您没有 TTY。可能是这个问题:unix.stackexchange.com/questions/122616/… - 尝试创建一个 PTY (stackoverflow.com/a/43012138/116546) 看看是否有帮助。
-
你明白了!我使用的是 3.x,所以将
start_new_session=True添加到Popen让它对非特权用户静默失败并以 root 身份成功,所以我想它也适用于我的无密码sudo用户。欢呼。如果您希望我接受,请随时发布答案。 =)