首页 > 解决方案 > python os.fork() 用于在降级凭据下执行操作

问题描述

我正在寻找在 python 中实现以下命令。

su ${USER} -c "whoami"

它只是创建在不同权限下运行的子进程,并将结果whoami返回给父进程。

os.fork()由于 bash 的工作原理,一旦智利进程终止其工作,就应该使用while 将结果检索到父进程来完成。

def runWhoamiOtherUser(self):
    pid = os.fork()
    if pid == 0:
        os.setuid(getpwnam(os.environ['USER'])[2])
        x = getpass.getuser()
        return x

    pid, status = os.waitpid(pid, 0)

这是正确的方法吗?

标签: pythonfork

解决方案


它已作为新功能添加到 Python 3.9 中的 subprocess 模块中,添加到 subprocess.Popen 构造函数中:

3.9 版中的新功能。

如果 user 不是 None,setreuid() 系统调用将在子进程执行之前在子进程中进行。如果提供的值是一个字符串,它将通过 pwd.getpwnam() 查找并使用 pw_uid 中的值。如果该值是整数,则将逐字传递。(仅限 POSIX)

https://docs.python.org/3.9/library/subprocess.html

在 3.9 之前,最好使用相同的 setreuid() 调用。如果您更喜欢用户,也可以使用相同的工具来更改组。该代码已添加到此提交中,如果您想检查设置的细节并可能将相关部分复制粘贴到您的程序中:https ://github.com/python/cpython/commit/2b2ead74382513d0bb9ef34504e283a71e6a706f


推荐阅读