0

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

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

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

导入操作系统
导入grp
mygroups = [grp.getgrgid(x).gr_name for x in os.getgroups()]

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

但这不适用于 root 用户,他确实具有权限但可能不是相关组的成员。我不清楚除了root之外是否有任何异常,所以我犹豫是否简单地编写一个仅涵盖root用户id的异常。

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

4

1 回答 1

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 不允许的“bare”子句。由于我们重新raise例外,因此这里没有问题。

于 2012-06-21T20:07:41.147 回答