允许Python应用创建和访问任何用户的文件,但不让用户直接访问文件
我正在用Python开发一个应用程序,但在文件权限方面遇到了麻烦。
我的应用程序使用shelve和logging模块来创建、访问和修改多个文件。
这个应用程序会放在服务器上,多个不同组的用户都会使用它。
我的问题是,这些文件是由第一次启动应用程序的用户创建的,所以文件的所有权归这个用户所有。之后,当其他用户启动应用程序时,他们没有权限访问这些文件,导致应用程序崩溃。
我可以修改权限,让所有用户都能访问和修改这些文件,但这样做并不太理想。
我发现使用setuid可能可以让应用程序在任何用户启动时都能访问这些文件,但又不让用户直接修改文件。这正是我需要的。
不过,我找不到办法修改shelve和logging模块创建的文件的umask或权限。
我觉得对于shelve访问的文件,我可以使用os.umask在访问之前创建文件,但对于logging创建的文件似乎不行,因为我使用的是一个旋转文件处理器,它可能会在日志文件满的时候创建新文件。
那么,处理这个问题的更“Pythonic”的方法是什么呢?
编辑:
根据评论的要求,这里有一段简单的代码片段,复现了我的问题。
#!/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 : Permission denied [...]/logfile.log
编辑2
一些额外的信息:
我在运行应用程序的系统上没有root权限,所以为我的应用程序专门创建一个用户似乎不太可能。
这个应用程序使用的频率很低,用户也很少,因此我现在假设他们不会同时访问它。
我不需要在应用程序中进行身份验证和授权。它应该对任何用户都能以相同的方式工作。
我认为,正如goncalopp所建议的,创建一个用户并以该用户身份运行应用程序是最好的解决方案,但我担心这可能行不通。我得去问一下系统管理员。
2 个回答
在你的问题中,没有明确说明如果多个用户同时运行这个应用程序会发生什么情况。这样的话,就会有多个进程同时写入同一个文件,除非你有一个明确的锁文件或者其他同步机制。
假设你已经解决了同步的问题,setuid
可能不是最好的解决方案。因为 Python 是一种解释型语言,设置起来特别麻烦,而且通常会有安全方面的考虑。
通常在 Unix 系统中,解决这类问题的方法是让你的程序以一个特定的系统用户身份运行,这个用户是专门为这个目的创建的。这个程序可以作为守护进程运行,或者在定时任务中执行。使用这种方法,如果你需要用户交互,那么你就需要明确地将操作暴露给用户,并且有身份验证和授权机制。
对于交互,你可以使用(Unix 或普通)套接字,或者监视/轮询目录,这取决于你的程序的性质。关于身份验证,
当然,所有这些都意味着需要额外的开发工作,而你可能在这个时候无法做到。一个变通方法是允许特定用户和命令的无密码 sudo 权限。
你可以试试用webbrowser这个接口来打开一个文件,
这样做不需要任何权限。