我正在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的专家,所以也许我这样做不正确?有没有正确的方法来做到这一点?