使用Python在Linux中检查文件权限


69

我正在编写一个脚本来检查用户目录中文件的权限,如果它们不可接受,我会警告他们,但是我不仅要检查登录用户的权限,还要检查组和其他用户的权限。我怎样才能做到这一点?在我看来,os.access()在Python中只能检查运行脚本的用户的权限。

Answers:


106

您是对的,就像底层访问syscall一样,os.access检查特定的用户(使用真实ID而不是有效ID来解决suid情况)。

os.stat是获取有关文件的更多常规信息(包括每个用户,组和其他用户的权限)的正确方法。返回st_mode的对象的属性os.stat具有文件的权限位。

为了帮助解释这些位,您可能需要使用stat模块。具体来说,你要定义的位掩码在这里,你会使用&操作符(位和)使用它们在屏蔽掉相关的位st_mode属性-例如,如果你只需要在真/假支票某个文件是否可以组可读,一种方法是:

import os
import stat

def isgroupreadable(filepath):
  st = os.stat(filepath)
  return bool(st.st_mode & stat.S_IRGRP)

请注意:os.stat通话可能会有些昂贵,因此请确保通过一次通话提取您关心的所有信息,而不是继续对感兴趣的每一部分重复通话;-)。


太好了,这正是我希望找到的。非常感谢你。我刚开始为工作中的一个小项目开始使用python,因此您可以知道我还在学习。非常感谢!
— 乔恩·菲诺

非常好的实用程序。谢谢!
— zerocog

15

只是为了帮助像我这样的人,他们来这里时有所不同:

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.

看到更多细节:https : //stackoverflow.com/a/5337329/1814774


自从我一直在寻找文件的ACL八进制值以来,这个答案对我来说最有用
— Joshua Detwiler

一样,这非常有用。
— matthewatabet


7

使用os.access()带有标志os.R_OK,os.W_OK和os.X_OK。

编辑:如果您正在Windows上测试目录权限,请查看此相关问题。


8
您没有阅读问题,os.access仅检查当前用户的权限。
— Martin Konecny

4
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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.