【问题标题】:Allow python application to create and access files for any user, but not the users to acces the files directly允许 python 应用程序为任何用户创建和访问文件,但不允许用户直接访问文件
【发布时间】:2014-07-30 11:18:56
【问题描述】:

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

我的应用程序正在使用 shelvelogging 模块创建、访问和修改多个文件。

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

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

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

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

但是,我找不到修改 umask 或 shelvelogging 模块创建的文件的权限的方法。

我认为也许对于 shelve 访问的文件,我可以使用 os.umask 在访问它们之前创建文件,但似乎行不通对于 logging 创建的文件,因为我正在使用旋转文件处理程序,它可能会在日志文件已满时创建文件。

处理这个问题的更 Pythonic 方式是什么?

编辑:

根据 cmets 的要求,这是一个简单的 sn-p 代码,可以复制我的问题。

#!/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 所建议的那样,创建一个用户并以该用户身份运行应用程序将是最好的解决方案,但恐怕这是不可能的。我得问问系统管理员。

【问题讨论】:

  • 您能否发布一些简短的示例代码并告诉我们哪个部分不起作用?
  • @miindlek:完成。对于 shelve 创建的文件,问题完全相同。
  • 最好的选择是修复应用程序,以便它为其创建的所有文件设置合理的所有权/权限。 os.umask 是其中的一部分,但您也可以进行明确的 chmod 调用...

标签: python linux permissions


【解决方案1】:

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

假设您已经解决了同步问题,setuid 可能不是这里的最佳解决方案。由于 python 是一种解释型语言,it's particularly difficult to setup, and the usual security considerations apply

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

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

当然,所有这些都意味着额外的开发工作,而您目前可能无法做到。 一种解决方法可能是允许passwordless sudo to a specific user and command

【讨论】:

  • 谢谢。但是,我在我的应用程序所在的系统上没有 root 访问权限。我将在编辑中添加一些信息。
  • @Bork 我不认为有一种方法可以让用户访问您的应用程序阻止他们直接访问其文件而无需 root 干预。在这种情况下,我认为您只需允许所有人(有权访问系统)通过更改权限来访问文件。
【解决方案2】:

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

不需要权限

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2013-07-31
    相关资源
    最近更新 更多