如果调用脚本与sudo一起运行,python子进程Popen是否会调用“inherit”根privs?

2024-06-01 08:42:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python脚本,它将使用子进程Popen(我在想communication())来运行各种shell命令等。通常,我正在执行的shell命令通常是用sudo(手动)运行的。在

我正在运行使用sudo子进程的脚本。我想知道是否可以安全地将sudo从所有子进程调用中删除,或者是否需要包含它并使用stdin提供密码。在

这似乎是一个很简单的问题,但我还没有找到答案。从我的实验来看,我可能不需要sudo,但我不确定这是否真的是真的,或者它是否只是“这样工作”,因为我最近提供了我的密码。在

编辑: 我想出了如何放下和恢复根。多处理包非常简单

...
from multiprocessing import Process, Pipe
...
parent_conn, child_conn = Pipe()
p = P(input_list, child_conn)
p.start()
p.join()
return RunSyncReturn(**parent_conn.recv())
...

class P(Process):
    def __init__(self, input_list, conn):
        super(P, self).__init__()
        self._input_list = input_list
        self._conn = conn

    def run(self):
        drop_privileges()
        process = Popen(self._input_list, stdout=PIPE)
        stdout, stderr = process.communicate()
        pmap = {}
        pmap['stdout'] = stdout
        pmap['stderr'] = stderr
        pmap['exit_code'] = process.returncode
        self._conn.send(pmap)
        self._conn.close()

RunSyncReturn只是一个数据持有者类。当用多处理进程类启动的进程死亡时,降低的特权也随之消失。在


Tags: 命令self脚本密码input进程stderrstdout
2条回答

子流程将继承用户ID和访问权限。只要您正在运行的命令中没有一个属于其他用户并且设置了s位,它们也将以root用户身份运行。在

^{bq}$

使用prexec_fn函数来删除由Popen()启动的子进程的权限,而不是临时更改同一进程中的特权,例如,查看^{} function。在

相关问题 更多 >