Python 如何使用stat检查文件权限?

Python 如何使用stat检查文件权限?,python,file-permissions,Python,File Permissions,有几个问题涉及使用Python的stat模块检查权限,但没有一个问题非常清楚结果或如何解释结果 stat模块有几个有用的外观常量: 统计数字 统计S_IWUSR 统计S_IXUSR GRP和OTH也一样。然而,目前尚不清楚如何解释这些结果。我确实发现您可以使用stat.S_IMODE来剪裁权限位,但我仍然感到困惑: import pathlib import stat import tempfile with tempfile.NamedTemporaryFile() as f: p

有几个问题涉及使用Python的stat模块检查权限,但没有一个问题非常清楚结果或如何解释结果

stat模块有几个有用的外观常量:

统计数字 统计S_IWUSR 统计S_IXUSR GRP和OTH也一样。然而,目前尚不清楚如何解释这些结果。我确实发现您可以使用stat.S_IMODE来剪裁权限位,但我仍然感到困惑:

import pathlib
import stat
import tempfile


with tempfile.NamedTemporaryFile() as f:
    p = pathlib.Path(f.name)
    print(oct(stat.S_IMODE(p.stat().st_mode)))
    p.chmod(
        stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
        | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
        | stat.S_IROTH | stat.S_IWOTH | stat.S_IXOTH
    )
    print(oct(stat.S_IMODE(p.stat().st_mode)))


    print(oct(stat.S_IMODE(p.stat().st_mode) & stat.S_IRUSR))
    print(oct(stat.S_IMODE(p.stat().st_mode) & stat.S_IROTH))
    print(oct(stat.S_IMODE(p.stat().st_mode) | stat.S_IROTH))
With&它只是打印出权限位,With |它只是打印出文件的权限

如果我想拥有像这样的东西:

>>> print('User can read file?', can_user_read(file))
True

我知道os.access是存在的,但是如果我想避免可能的安全问题,只使用stat,我需要做什么呢?

这实际上比看起来更简单。当您只是检查文件上已经存在的权限时,可能会产生混乱-按位and就是这样做的:显示在两个文件上设置了哪些位

如果您只是想从中得到一个布尔值,这很方便,因为Python将0视为False,其余整数视为True。我们甚至不需要使用stat.S_IMODE函数,只需使用位掩码即可。有不相关的信息并不重要:

  1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1  # 077 permissions
& 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0  # see bin(stat.S_IROTH)
---------------------------------
  0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
通过使用&,我们只关心两者中的内容

加上整数的真实性意味着请求的函数如下所示:

def can_user_read(file):
    return bool(file.stat().st_mode & stat.S_IRUSR)

您所指的安全问题是什么?我认为os.access通常会给你比stat更可靠的结果;操作系统通常有扩展,允许更细粒度的权限,而这些权限不会反映在stat数据中;事实上,一些这样的扩展是标准化的,请参见POSIX ACL……如果您指的是TOCTOU问题,那么您也可以通过检查统计数据获得这些问题;这不是一种有意义的辩护——唯一正确的做法是采用“试一试”的权限检查方法,在实际尝试中处理拒绝访问的错误,就像在相同的尝试之前处理检查失败一样。stat严格来说比access差;它仍然有缺点,但提供的数据不太准确。在我的情况下,我不在乎是否可以访问我已经访问过的文件,我正在努力确保其他人可以访问这些文件。