gpt4 book ai didi

python - python 中的 sudo renice

转载 作者:太空狗 更新时间:2023-10-29 11:12:19 26 4
gpt4 key购买 nike

一般来说,这是一个很好回答的问题。 Linux 不允许非特权用户降低 PID 的友好度,以 root 身份运行东西本身就是一种蠕虫病毒。

也就是说,这是我的具体情况:我有一个用户帐户可以管理一些进程,这些进程具有 renice 的无密码 sudo 权限和一些其他命令使用。我还有一个脚本,它是该系统上所有用户的公共(public)入口点。该脚本既可以运行常规用户程序,也可以运行由特殊帐户管理的进程。因此,当脚本以特定选项运行时,如果可以的话,它应该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,那就更好了。

有什么建议吗?

最佳答案

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

关于python - python 中的 sudo renice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44575497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com