如果用sudo运行调用脚本,python subprocess Popen会“继承”root权限吗?
我正在写一个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 用户的身份运行。