Выполнять операции с разными пользователями

#django #python-3.x

#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=%samp;home_dir=%samp;uid=%samp;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 (daemon) и получает ответ.

Демон 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 , поэтому я больше не смогу изменить, как этот процесс читает каталог другого пользователя.

Я не эксперт в Python, так что, возможно, я делаю это неправильно? Есть ли правильный способ сделать это?

Комментарии:

1. Почему бы не использовать sudo ?

2. Есть ли sudo решение, даже если оно запущено в django приложении? насколько я знаю, мне нужно было бы subprocess выполнить какую sudo -либо операцию, и это не позволяет мне напрямую создавать или изменять файл.

3. Почему вы не можете создать или изменить файл?

4. файловому менеджеру требовалось оперативное редактирование, поэтому мне нужно получить полное содержимое файла. sudo это позволит мне создать файл, но как мне сохранить содержимое из моей интерфейсной текстовой области в новый файл, используя sudo без open() использования?

5. [1] Прочитайте файл, загрузите его в текстовую область — используйте sudo открыть, [2] Позвольте пользователю редактировать файл (здесь sudo не нужен) [3] Когда пользователю нужно сохранить, откройте файл в w режиме (используйте sudo) и сохраните файл