如果用sudo运行调用脚本,python subprocess Popen会“继承”root权限吗?

0 投票
2 回答
2641 浏览
提问于 2025-04-17 21:10

我正在写一个Python脚本,打算用subprocess模块里的Popen(我在想用communicate())来运行各种命令行指令。通常,我执行的这些命令在手动运行时,都是需要用到sudo的。

我用sudo来运行这个使用subprocess的脚本。我在想,是不是可以安全地不在所有的subprocess调用中加上sudo,还是说我需要加上,并用标准输入来提供密码。

这看起来是个很简单的问题,但我到现在还没找到答案。根据我的实验,似乎我可能不需要用sudo,但我不确定这是不是确实如此,还是因为我最近输入过密码,所以现在“刚好能用”。

编辑:我找到了如何放弃和恢复超级用户权限的方法。用multiprocessing这个包做起来很简单。

...
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只是一个数据存储类。当用multiprocessing的Process类启动的进程结束时,降低的权限也随之消失。

2 个回答

0

我原本希望这样做:change_privileges(); do_something(); change_privileges('root', 'root')

与其在同一个程序中临时改变权限,不如使用 prexec_fn 函数,只在通过 Popen() 启动的子进程中降低权限。例如,可以看看 demote() 函数

4

用户 ID 和访问权限会被子进程继承。只要你运行的命令没有被其他用户拥有,并且没有设置 s 位,它们也会以 root 用户的身份运行。

撰写回答