python文件/ dir权限:事先验证权限

时间:2012-06-21 19:44:04

标签: python permissions posix root

我正在通过python模块创建目录。某些类型的目录需要设置某些限制性访问权限。该模块将通过脚本使用;并且脚本可以由用户或服务器(以root身份)运行。

我想避免我创建目录的情况,尝试更改其权限并捕获OSError异常,因为我没有足够的权限。它不是在它发生之后试图清理一团糟,而是为我的应用程序提供更强大的功能,以便首先防止出现问题。我希望有一些方法可以确定运行脚本的用户在实际尝试使用它们之前是否具有组权限。

对于“普通”用户,我可以这样做:

import os
import grp
mygroups = [grp.getgrgid(x).gr_name for x in os.getgroups()]

然后,如果mygroups不包含我需要包含的组,我可以优雅地退出。

但这对root用户不起作用,root用户确实拥有权限,但可能不是相关组的成员。我不清楚除了root之外是否还有其他例外,所以我只想编写一个只覆盖root用户ID的异常。

在python 2.x中是否有一种强大的方法来检查当前用户是否具有某些组权限(更改访问权限和目录的所有权)而不实际尝试使用这些权限(抛出OSError)?

1 个答案:

答案 0 :(得分:0)

  

在python 2.x中是否有一种强大的方法来检查当前用户是否具有某些组权限(更改访问权限和目录的所有权)而不实际尝试使用这些权限(抛出OSError)?

也许;我不知道POSIX是否允许进程的组在运行时从外部进行更改。如果没有,可能有办法做到这一点。如果是的话,那就是竞争条件。

在任何情况下,它都不是在Python或POSIX中执行此操作的首选方法。这是做你想做的事情的有力方式:

def mkdir_for_gid(path, gid, mode):
    # make a dir that no-one may touch.
    os.mkdir(path, 0700)
    try:
        os.chown(path, os.getuid(), gid)
        os.chmod(path, mode)
        return path
    except:
        # Some operation failed. We don't care which one, we just clean up.
        # We do know that it wasn't mkdir, so the error from that is not masked
        # by any error from rmdir.
        os.rmdir(path)
        raise

请注意,我正在使用“裸”except子句,Python样式指南PEP-8不允许这样做。由于我们重新raise异常,因此这里没有问题。