【发布时间】: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