python子进程是否会调用';继承';如果调用脚本使用sudo运行,则为root privs?

python子进程是否会调用';继承';如果调用脚本使用sudo运行,则为root privs?,python,subprocess,sudo,Python,Subprocess,Sudo,我正在编写一个python脚本,它将使用subprocess Popen(我想是communicate())来运行各种shell命令,等等。通常,我正在执行的shell命令通常会(手动)与sudo一起运行 我正在运行使用sudo子进程的脚本。我想知道我是否可以安全地让sudo关闭所有的子进程调用,或者是否需要包括它并使用stdin提供密码 这似乎是一个相当简单的问题,但我还没有找到答案。从我的实验来看,我似乎不需要sudo,但我不确定这是真的,还是因为我最近提供了密码,所以它只是“以这种方式工作

我正在编写一个python脚本,它将使用subprocess Popen(我想是communicate())来运行各种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只是一个数据持有者类。当使用多处理进程类启动的进程死亡时,降低的权限也随之消失

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

用户ID和访问权限将由子进程继承。只要您正在运行的命令中没有一个为其他用户所有并且设置了s位,那么它们也将作为root用户运行

我希望这样做:
change_privileges();做某事;更改权限('root','root')

使用
prexec\u fn
函数仅删除由
Popen()
启动的子进程的权限,而不是尝试暂时更改同一进程中的权限,例如,查看

我希望这样做:
change_privileges();做某事;更改权限('root','root')


使用
prexec\u fn
函数仅删除由
Popen()
启动的子进程的权限,而不是尝试暂时更改同一进程中的权限,例如,查看。

UID由
fork()
ed进程继承。可能值得考虑的是,您是否真的需要成为所有事情的
root
,或者是否可以在可能的情况下(使用
os.setuid()
os.setgid()
)放弃权限(比如说
nobody
)。作为一般的经验法则,只有在绝对需要的时候才应该是
root
,这很容易做到。埃米特,这是一个很好的观点。除非确实需要sudo,否则我将研究如何使用os.setuid()和os.setgid()。谢谢你的评论。克里斯,我想这可能对你有用。再次谢谢你,埃米特。这是一个有用的链接。您是否知道是否有一种方法可以仅对特定代码块“删除特权”。换言之,这是一种在无人知晓的情况下重新扎根的方法。为此,我修改了您指向我的代码,但一旦我将os.setgid()和os.setuid()放在无人的位置,它们就会失败(不允许)。您可能应该另外问一个问题,关于
无法设置有效的组id
erroruid由
fork()
ed进程继承。可能值得考虑的是,您是否真的需要成为所有事情的
root
,或者是否可以在可能的情况下(使用
os.setuid()
os.setgid()
)放弃权限(比如说
nobody
)。作为一般的经验法则,只有在绝对需要的时候才应该是
root
,这很容易做到。埃米特,这是一个很好的观点。除非确实需要sudo,否则我将研究如何使用os.setuid()和os.setgid()。谢谢你的评论。克里斯,我想这可能对你有用。再次谢谢你,埃米特。这是一个有用的链接。您是否知道是否有一种方法可以仅对特定代码块“删除特权”。换言之,这是一种在无人知晓的情况下重新扎根的方法。为此,我修改了您为我指出的代码,但一旦我将os.setgid()和os.setuid()删除为nobody,它们就会失败(不允许)。您可能应该另外问一个问题,关于
无法设置有效的组id
错误