【发布时间】:2010-12-24 03:02:51
【问题描述】:
我正在编写一个脚本来检查用户目录中文件的权限,如果它们不可接受,我会警告他们,但我不仅要检查登录用户的权限,还要检查组和其他人的权限.我怎样才能做到这一点?在我看来,Python 中的os.access() 只能检查运行脚本的用户的权限。
【问题讨论】:
标签: python
我正在编写一个脚本来检查用户目录中文件的权限,如果它们不可接受,我会警告他们,但我不仅要检查登录用户的权限,还要检查组和其他人的权限.我怎样才能做到这一点?在我看来,Python 中的os.access() 只能检查运行脚本的用户的权限。
【问题讨论】:
标签: python
import os
os.access('my_file', os.R_OK) # Check for read access
os.access('my_file', os.W_OK) # Check for write access
os.access('my_file', os.X_OK) # Check for execution access
os.access('my_file', os.F_OK) # Check for existence of file
【讨论】:
只是为了帮助像我这样的人来这里做一些不同的事情:
import os
import stat
st = os.stat(yourfile)
oct_perm = oct(st.st_mode)
print(oct_perm)
>>> 0o100664 //the last 3 or 4 digits is probably what you want.
【讨论】:
os.access 是对的,就像底层的 access 系统调用一样,检查特定用户(真实而不是有效的 ID,以帮助解决 suid 情况)。
os.stat 是获取有关文件的更多一般信息的正确方法,包括每个用户、组和其他人的权限。 os.stat 返回的对象的st_mode 属性具有文件的权限位。
为了帮助解释这些位,您可能需要使用stat 模块。具体来说,您需要定义here 的位掩码,并且您将使用& 运算符(位与)来使用它们来屏蔽st_mode 属性中的相关位——例如,如果您只需要对某个文件是否是组可读的进行真/假检查,一种方法是:
import os
import stat
def isgroupreadable(filepath):
st = os.stat(filepath)
return bool(st.st_mode & stat.S_IRGRP)
请注意:os.stat 调用可能有点昂贵,因此请确保通过一次调用提取您关心的所有信息,而不是针对每个感兴趣的部分重复调用;-)。
【讨论】:
您可以通过os.stat(path) 结合stat 模块检查文件权限以解释结果。
【讨论】:
将os.access() 与标志os.R_OK、os.W_OK 和os.X_OK 一起使用。
编辑:如果您在 Windows 上测试目录权限,请查看 this related question。
【讨论】: