使用Python预先验证权限?

使用Python预先验证权限?,python,permissions,posix,root,Python,Permissions,Posix,Root,我正在通过python模块创建目录。某些目录需要设置某些限制性访问权限。该模块将通过脚本使用;脚本可以由用户或服务器(作为根用户)运行 我希望避免这样的情况:我创建了一个目录,试图更改它的权限并捕获一个OSError异常,因为我没有足够的权限。与其在问题发生后试图清理混乱,不如让我的应用程序从一开始就更健壮地防止问题的发生。我的希望是,在实际尝试使用组权限之前,可以通过某种方式确定运行脚本的用户是否具有组权限 对于“普通”用户,我可以这样做: import os import grp mygro

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

我希望避免这样的情况:我创建了一个目录,试图更改它的权限并捕获一个OSError异常,因为我没有足够的权限。与其在问题发生后试图清理混乱,不如让我的应用程序从一开始就更健壮地防止问题的发生。我的希望是,在实际尝试使用组权限之前,可以通过某种方式确定运行脚本的用户是否具有组权限

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

import os import grp mygroups = [grp.getgrgid(x).gr_name for x in os.getgroups()] 导入操作系统 进口玻璃钢 mygroups=[grp.getgrgid(x).gr\u os.getgroups()中x的名称] 然后,如果mygroups不包含我需要它包含的组,我可以优雅地退出

但这对根用户不起作用,根用户虽然有权限,但可能不是相关组的成员。我不清楚是否存在根用户以外的任何异常,因此我不太确定是否只编写一个只包含根用户id的异常

在Python2.x中是否有一种可靠的方法来检查当前用户是否具有某些组权限(更改访问权限和目录所有权),而不实际尝试使用这些权限(抛出操作系统错误)

在Python2.x中是否有一种可靠的方法来检查当前用户是否具有某些组权限(更改访问权限和目录所有权),而不实际尝试使用这些权限(抛出操作系统错误)

也许;我不知道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

注意,我使用的是一个“bare”
except
子句,Python风格指南PEP-8不允许这样做。因为我们重新提出了异常,所以这里没有问题。

捕获异常没有问题。请求原谅,而不是许可是处理事情的蟒蛇式方式,它意味着你避免了种族状况。@Lattyware:情况比你想象的要复杂一些。如果可以尽早验证权限,那么就可以避免事后清理一片混乱。@larsmans:os.mkdir()、os.chmod()、os.chown()@MayurPatel:没关系,我明白你的意思了。我在
chown
语义方面弄错了。@MayurPatel如果你检查,权限会改变,然后它会继续吗?你仍然需要处理这个异常并清理它。我考虑过了。我希望避免实际上不必要地创建临时目录——看起来很混乱。我想肯定会有一些简单的方法来确定用户的权限@MayurPatel:Python和POSIX不是这样设计的(除了
access
系统调用),因为它会留下各种各样的安全漏洞。“试试看”是最好的建议。