与不同用户一起执行操作

时间:2016-10-23 05:38:55

标签: django python-3.x

我正在Django使用Python 3.5.2开发文件管理器。我需要管理由不同Linux用户拥有的文件,但每个用户都没有任何读取其他用户的权限。文件。

我尝试开发一个root守护进程,它只接受来自主应用程序的命令,不能直接访问。守护程序使用os.fork()启动将执行seteuid()setguid()的新子项,然后执行文件管理器操作。

但是,我在处理分叉孩子方面没有太大成功。我需要的是能够使用seteuid()setguid()在不同用户下运行命令,以便每个用户都可以正确管理自己的文件。

以下是我在Django中的代码:

主要应用views.py

def file_operation(request):

    user = {
        'username': request.session.get("username"),
        'home_dir': request.session.get('home_dir'),
        'uid': request.session.get("uid"),
        'gid': request.session.get("gid")
    }

    url = u'%s:%s/files?username=%s&home_dir=%s&uid=%s&gid=%s' % (
        settings.DAEMON_FILE_HOST, settings.DAEMON_FILE_PORT,
        user['username'], user['home_dir'], user['uid'], user['gid']
    )

    return ProxyRequest().proxy_view(request, url)

ProxyRequest()是一个自定义类,它将所有请求从主应用程序传递到另一个URL(守护程序)并检索响应。

守护程序views.py

def connector(request):

    user = {
        'username': request.GET.get("username"),
        'home_dir': request.GET.get('home_dir'),
        'uid': int(request.GET.get("uid")),
        'gid': int(request.GET.get("gid"))
    }

    newpid = os.fork()
    response = None
    if newpid == 0:
        setegid(user['gid'])
        seteuid(user['uid'])
        response = RunCommand(user, request.GET.copy(), request.POST.copy(), request.FILES.copy())

    os.waitpid(newpid,0)
    return response

RunCommand()是根据收到的request的不同类型执行文件操作的后端进程。

如果我不使用os.fork(),我的守护程序进程会在seteuid()而不是root后停留在另一位用户,因此我无法再更改euid的{​​{1}}进程读取另一个用户目录。

我不是Python的专家,所以也许我这样做不正确?有没有正确的方法来做到这一点?

0 个答案:

没有答案