#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) и сохраните файл