【问题标题】:sudo renice in pythonpython中的sudo renice
【发布时间】: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 用户。欢呼。如果您希望我接受,请随时发布答案。 =)

标签: python linux sudo renice


【解决方案1】:

我认为是因为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 身份成功。

【讨论】:

  • 差不多。我使用了Popen 参数,但您最初的评论让我得到了答案。非常感谢。 =)
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 2018-10-24
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
相关资源
最近更新 更多