【问题标题】:Will a python subprocess Popen call 'inherit' root privs if the calling script is run with sudo?如果调用脚本使用 sudo 运行,python 子进程 Popen 会调用“继承”根权限吗?
【发布时间】:2014-04-09 14:50:23
【问题描述】:

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

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

这似乎是一个非常简单的问题,但我一直找不到答案。从我的实验来看,我似乎不需要 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 只是一个数据持有者类。当使用多进程进程类启动的进程终止时,降低的权限随之消失。

【问题讨论】:

  • UID 由fork()ed 进程继承。可能值得考虑您是否真的需要 成为root,或者您是否可以在可能的情况下将特权(例如)放弃到nobody(使用os.setuid()os.setgid())。作为一般的经验法则,你应该只在绝对需要时才使用root,而且这很容易做到。
  • Emmet,这是一个很好的观点。我会考虑使用 os.setuid() 和 os.setgid() 除非真的需要 sudo。感谢您的评论。
  • 克里斯,我 found this 并认为它可能对你有用。
  • 再次感谢艾米特。这是一个有用的链接。您是否碰巧知道是否有一种方法可以仅针对特定代码块“放弃特权”。换句话说,一种在放弃给任何人后回到根目录的方法。为此,我修改了您指向我的代码,但是一旦我放弃给任何人, os.setgid() 和 os.setuid() 就会失败(不允许)。
  • 你可能应该问一个关于Could not set effective group id错误的单独问题

标签: python subprocess sudo


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    不要尝试临时更改同一进程中的权限,而是使用prexec_fn 函数仅删除由Popen() 启动的子进程的权限,例如,查看demote() function

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多