允许python应用程序为任何用户创建和访问文件,但不允许用户直接访问文件

允许python应用程序为任何用户创建和访问文件,但不允许用户直接访问文件,python,linux,permissions,Python,Linux,Permissions,我正在用python开发一个应用程序,我正在努力解决文件权限问题 我的应用程序正在使用搁置和日志模块创建、访问和修改多个文件 此应用程序将位于服务器上,并将由属于不同组的多个用户使用 我的问题是,文件被标记为第一次启动应用程序的用户所拥有,从而创建了文件,之后,当另一个用户启动应用程序时,他没有访问文件所需的权限,应用程序崩溃 我可以修改权限以允许所有用户访问和修改文件,但这并不能真正令人满意 我发现使用setuid我可能允许应用程序在任何用户启动时访问文件,但不允许用户直接修改文件。这正是我需

我正在用python开发一个应用程序,我正在努力解决文件权限问题

我的应用程序正在使用搁置日志模块创建、访问和修改多个文件

此应用程序将位于服务器上,并将由属于不同组的多个用户使用

我的问题是,文件被标记为第一次启动应用程序的用户所拥有,从而创建了文件,之后,当另一个用户启动应用程序时,他没有访问文件所需的权限,应用程序崩溃

我可以修改权限以允许所有用户访问和修改文件,但这并不能真正令人满意

我发现使用setuid我可能允许应用程序在任何用户启动时访问文件,但不允许用户直接修改文件。这正是我需要的

但是,我找不到修改umask或由搁置日志模块创建的文件的权限的方法

我认为,对于通过shelve访问的文件,我可能可以在访问它们之前使用os.umask创建文件,但这似乎不适用于通过日志记录创建的文件,因为我使用的是一个旋转文件处理程序,它可能会在日志文件满时创建文件

还有什么更像蟒蛇的方式来处理呢

编辑:

正如在评论中提到的,这里有一个简单的代码片段,它复制了我的问题

#!/usr/bin/env python2.7
import logging

logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG)

fh = logging.FileHandler('logfile.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.info('Test')
现在,如果用户A启动应用程序,将创建一个日志文件。如果用户B随后启动该应用程序,则我有一个错误,因为他没有访问日志文件的权限

错误为IOError:权限被拒绝[…]/logfile.log

编辑2

一些补充资料:

我在我的应用程序所在的系统上没有root访问权限,因此,为我的应用程序专门设置一个用户创建一个仅用于我的应用程序的用户似乎是不可能的

该应用程序将很少被使用,并且只有少数人使用,因此我现在假设用户不会同时访问它

我不需要在应用程序中进行身份验证和授权。它应该对任何用户都是一样的


我认为,正如goncalopp所建议的那样,创建一个用户并以该用户的身份运行应用程序将是最好的解决方案,但我担心这是不可能的。我必须问系统管理员。

您的问题不清楚如果多个用户同时运行应用程序会发生什么。您将有多个进程同时写入相同的文件,除非您有显式的锁定文件或其他同步机制

假设已经解决了同步问题,
setuid
可能不是这里的最佳解决方案。由于python是一种解释语言

对于这类问题,通常的unix解决方案是让您的程序以特定的系统用户身份运行,该用户是专门为此目的创建的。该程序既可以作为守护进程运行,也可以在cronjob中运行。使用此方法,如果需要用户交互,则必须向程序中的用户显式公开操作,并且具有身份验证和授权机制

例如,对于交互,可以使用(unix或普通)套接字或监视/池目录,具体取决于程序的性质。对于身份验证


当然,所有这些都意味着额外的开发工作,这在此时您可能无法完成一种解决方法可以允许

您可以尝试使用webbrowser api打开文件


它不需要权限

你能发布一些简短的示例代码,告诉我们哪个部分不工作吗?@miindlek:Done。对于由搁置创建的文件,问题完全相同。最好的选择是修复应用程序,使其对所创建的所有文件设置合理的所有权/权限
os.umask
是其中的一部分,但是您也可以执行显式
chmod
调用…谢谢。但是,我在应用程序所在的系统上没有root访问权限。我将在编辑中添加一些信息。@Bork我不认为有一种方法既能让用户访问您的应用程序,又能防止他们在没有root干预的情况下直接访问其文件。在这种情况下,我认为您只需通过更改权限来允许所有人(有权访问系统)访问文件。