如何从文件中获取 Unix 权限掩码?

发布于 2024-10-22 17:20:27 字数 81 浏览 2 评论 0原文

如何使用 python 在 *nix 上获取文件的权限掩码,例如 644 或 755?

有没有任何函数或类可以做到这一点?非常感谢!

How can I get a file's permission mask like 644 or 755 on *nix using python?

Is there any function or class for doing that? Thank you very much!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

何以笙箫默 2024-10-29 17:20:28
oct(os.stat('file').st_mode)[4:]
oct(os.stat('file').st_mode)[4:]
爱本泡沫多脆弱 2024-10-29 17:20:28

如果路径允许访问,os.access(path, mode) 方法返回 True,如果不允许,则返回 False

可用模式有:

  1. os.F_OK - 测试路径是否存在。
  2. os.R_OK - 测试路径的可读性。
  3. os.W_OK - 测试路径的可写性。
  4. os.X_OK - 测试路径是否可以执行。

例如,检查文件/tmp/test.sh是否具有执行权限

ls -l /tmp/temp.sh
-rw-r--r--  1 *  *  0 Mar  2 12:05 /tmp/temp.sh

os.access('/tmp/temp.sh',os.X_OK)
False

after changing the file permission to +x 
chmod +x /tmp/temp.sh

ls -l /tmp/temp.sh
-rwxr-xr-x  1 *  *  0 Mar  2 12:05 /tmp/temp.sh

os.access('/tmp/temp.sh',os.X_OK)
True

os.access(path, mode) method returns True if access is allowed on path, False if not.

available modes are :

  1. os.F_OK - test the existence of path.
  2. os.R_OK - test the readability of path.
  3. os.W_OK - test the writability of path.
  4. os.X_OK - test if path can be executed.

for example, checking file /tmp/test.sh has execute permission

ls -l /tmp/temp.sh
-rw-r--r--  1 *  *  0 Mar  2 12:05 /tmp/temp.sh

os.access('/tmp/temp.sh',os.X_OK)
False

after changing the file permission to +x 
chmod +x /tmp/temp.sh

ls -l /tmp/temp.sh
-rwxr-xr-x  1 *  *  0 Mar  2 12:05 /tmp/temp.sh

os.access('/tmp/temp.sh',os.X_OK)
True
陈年往事 2024-10-29 17:20:28

这是检查目录权限的简单方法。

import os
import stat

mode = os.stat("path_of_directory").st_mode

if not ((mode & stat.S_IWUSR):
  print('not writable by user')

if not ((mode & stat.S_IWUSR) and (mode & stat.S_IWGRP) and (mode & stat.S_IWOTH)):
  print('not writable by all')

标志列表如下:

S_IRWXU 00700   mask for file owner permissions
S_IRUSR 00400   owner has read permission
S_IWUSR 00200   owner has write permission
S_IXUSR 00100   owner has execute permission
S_IRWXG 00070   mask for group permissions
S_IRGRP 00040   group has read permission
S_IWGRP 00020   group has write permission
S_IXGRP 00010   group has execute permission
S_IRWXO 00007   mask for permissions for others (not in group)
S_IROTH 00004   others have read permission
S_IWOTH 00002   others have write permission
S_IXOTH 00001   others have execute permission

Here is a simple way to check the permissions of a directory .

import os
import stat

mode = os.stat("path_of_directory").st_mode

if not ((mode & stat.S_IWUSR):
  print('not writable by user')

if not ((mode & stat.S_IWUSR) and (mode & stat.S_IWGRP) and (mode & stat.S_IWOTH)):
  print('not writable by all')

The flag list is herebelow :

S_IRWXU 00700   mask for file owner permissions
S_IRUSR 00400   owner has read permission
S_IWUSR 00200   owner has write permission
S_IXUSR 00100   owner has execute permission
S_IRWXG 00070   mask for group permissions
S_IRGRP 00040   group has read permission
S_IWGRP 00020   group has write permission
S_IXGRP 00010   group has execute permission
S_IRWXO 00007   mask for permissions for others (not in group)
S_IROTH 00004   others have read permission
S_IWOTH 00002   others have write permission
S_IXOTH 00001   others have execute permission
ζ澈沫 2024-10-29 17:20:28

我确信 os 模块中有很多基于文件的函数。如果您运行 os.stat(filename) ,您始终可以解释结果。

http://docs.python.org/library/stat.html

There are a lot of file based functions inside the os module im sure. If you run os.stat(filename) you can always interprate the results.

http://docs.python.org/library/stat.html

阪姬 2024-10-29 17:20:28

os.stat 类似于c-lib stat(linux上man 2 stat查看信息)

stats = os.stat('file.txt')
print(stats.st_mode)

os.stat is analogous to the c-lib stat (man 2 stat on linux to see the information)

stats = os.stat('file.txt')
print(stats.st_mode)
抚笙 2024-10-29 17:20:28

如果需要,您可以使用 Popen 运行 Bash stat 命令:

普通的 Bash 命令:

jlc@server:~/NetBeansProjects/LineReverse$ stat -c '%A %a %n' revline.c
-rw-rw-r-- 664 revline.c

然后使用 Python:

>>> from subprocess import Popen, PIPE
>>> fname = 'revline.c'
>>> cmd = "stat -c '%A %a %n' " + fname
>>> out = Popen(cmd, shell=True, stdout=PIPE).communicate()[0].split()[1].decode()
>>> out
'664'

如果您想搜索目录,这里还有另一种方法:

>>> from os import popen
>>> cmd = "stat -c '%A %a %n' *"
>>> fname = 'revline.c'
>>> for i in popen(cmd):
...     p, m, n = i.split()
...     if n != fname:
...         continue
...     print(m)
        break
... 
664
>>> 

You can just run a Bash stat command with Popen if you want:

The normal Bash command:

jlc@server:~/NetBeansProjects/LineReverse$ stat -c '%A %a %n' revline.c
-rw-rw-r-- 664 revline.c

And then with Python:

>>> from subprocess import Popen, PIPE
>>> fname = 'revline.c'
>>> cmd = "stat -c '%A %a %n' " + fname
>>> out = Popen(cmd, shell=True, stdout=PIPE).communicate()[0].split()[1].decode()
>>> out
'664'

And here's another way if you feel like searching the directory:

>>> from os import popen
>>> cmd = "stat -c '%A %a %n' *"
>>> fname = 'revline.c'
>>> for i in popen(cmd):
...     p, m, n = i.split()
...     if n != fname:
...         continue
...     print(m)
        break
... 
664
>>> 
疑心病 2024-10-29 17:20:27

os.statstat(2) 的包装器系统调用接口。

>>> import os
>>> from stat import *
>>> os.stat("test.txt") # returns 10-tupel, you really want the 0th element ...
posix.stat_result(st_mode=33188, st_ino=57197013, \
    st_dev=234881026L, st_nlink=1, st_uid=501, st_gid=20, st_size=0, \
    st_atime=1300354697, st_mtime=1300354697, st_ctime=1300354697)

>>> os.stat("test.txt")[ST_MODE] # this is an int, but we like octal ...
33188

>>> oct(os.stat("test.txt")[ST_MODE])
'0100644'

从这里您将认识典型的八进制权限。

S_IRWXU 00700   mask for file owner permissions
S_IRUSR 00400   owner has read permission
S_IWUSR 00200   owner has write permission
S_IXUSR 00100   owner has execute permission
S_IRWXG 00070   mask for group permissions
S_IRGRP 00040   group has read permission
S_IWGRP 00020   group has write permission
S_IXGRP 00010   group has execute permission
S_IRWXO 00007   mask for permissions for others (not in group)
S_IROTH 00004   others have read permission
S_IWOTH 00002   others have write permission
S_IXOTH 00001   others have execute permission

您实际上只对较低的感兴趣,因此您可以砍掉其余部分:

>>> oct(os.stat("test.txt")[ST_MODE])[-3:]
'644'
>>> # or better
>>> oct(os.stat("test.txt").st_mode & 0o777)

旁注:上面的部分确定文件类型,例如:

S_IFMT      0170000 bitmask for the file type bitfields
S_IFSOCK    0140000 socket
S_IFLNK     0120000 symbolic link
S_IFREG     0100000 regular file
S_IFBLK     0060000 block device
S_IFDIR     0040000 directory
S_IFCHR     0020000 character device
S_IFIFO     0010000 FIFO
S_ISUID     0004000 set UID bit
S_ISGID     0002000 set-group-ID bit (see below)
S_ISVTX     0001000 sticky bit (see below)

os.stat is a wrapper around the stat(2) system call interface.

>>> import os
>>> from stat import *
>>> os.stat("test.txt") # returns 10-tupel, you really want the 0th element ...
posix.stat_result(st_mode=33188, st_ino=57197013, \
    st_dev=234881026L, st_nlink=1, st_uid=501, st_gid=20, st_size=0, \
    st_atime=1300354697, st_mtime=1300354697, st_ctime=1300354697)

>>> os.stat("test.txt")[ST_MODE] # this is an int, but we like octal ...
33188

>>> oct(os.stat("test.txt")[ST_MODE])
'0100644'

From here you'll recognize the typical octal permissions.

S_IRWXU 00700   mask for file owner permissions
S_IRUSR 00400   owner has read permission
S_IWUSR 00200   owner has write permission
S_IXUSR 00100   owner has execute permission
S_IRWXG 00070   mask for group permissions
S_IRGRP 00040   group has read permission
S_IWGRP 00020   group has write permission
S_IXGRP 00010   group has execute permission
S_IRWXO 00007   mask for permissions for others (not in group)
S_IROTH 00004   others have read permission
S_IWOTH 00002   others have write permission
S_IXOTH 00001   others have execute permission

You are really only interested in the lower bits, so you could chop off the rest:

>>> oct(os.stat("test.txt")[ST_MODE])[-3:]
'644'
>>> # or better
>>> oct(os.stat("test.txt").st_mode & 0o777)

Sidenote: the upper parts determine the filetype, e.g.:

S_IFMT      0170000 bitmask for the file type bitfields
S_IFSOCK    0140000 socket
S_IFLNK     0120000 symbolic link
S_IFREG     0100000 regular file
S_IFBLK     0060000 block device
S_IFDIR     0040000 directory
S_IFCHR     0020000 character device
S_IFIFO     0010000 FIFO
S_ISUID     0004000 set UID bit
S_ISGID     0002000 set-group-ID bit (see below)
S_ISVTX     0001000 sticky bit (see below)
氛圍 2024-10-29 17:20:27

我认为这是获取文件权限位的最清晰方法:

stat.S_IMODE(os.lstat("file").st_mode)

如果文件是符号链接,则 os.lstat() 将为您提供链接本身的模式,而 os.stat() 取消引用链接。因此,我发现 os.lstat() 是最常用的。

stat.S_IMODE() 获取“文件的权限位,加上粘性位、set-group-id 和 set-user-id 位”。

这是一个示例案例,给定常规文件“testfile”及其符号链接“testlink”:

import stat
import os

print oct(stat.S_IMODE(os.lstat("testlink").st_mode))
print oct(stat.S_IMODE(os.stat("testlink").st_mode))

该脚本为我输出以下内容:

0777
0666

I think this is the clearest way of getting a file's permission bits:

stat.S_IMODE(os.lstat("file").st_mode)

If the file is a symlink, os.lstat() will give you the mode of the link itself, whereas os.stat() dereferences the link. Therefore I find os.lstat() the most generally useful.

stat.S_IMODE() gets "the file’s permission bits, plus the sticky bit, set-group-id, and set-user-id bits".

Here's an example case, given regular file "testfile" and symlink to it, "testlink":

import stat
import os

print oct(stat.S_IMODE(os.lstat("testlink").st_mode))
print oct(stat.S_IMODE(os.stat("testlink").st_mode))

This script outputs the following for me:

0777
0666
唯憾梦倾城 2024-10-29 17:20:27

如果您不想弄清楚 stat 的含义,另一种方法是使用 os.access 命令 http://docs.python.org/library/os.html#os.access
但请阅读有关可能的安全问题的文档

例如,检查具有读/写权限的文件 test.dat 的权限

os.access("test.dat",os.R_OK)
>>> True

#Execute permissions
os.access("test.dat",os.X_OK)
>>> False

#And Combinations thereof
os.access("test.dat",os.R_OK or os.X_OK)
>>> True

os.access("test.dat",os.R_OK and os.X_OK)
>>> False

Another way to do it if you don't want to work out what stat means is to use the os.access command http://docs.python.org/library/os.html#os.access
BUT read the docs about possible security issues

For instance to check permissions on the file test.dat which has read/write permissions

os.access("test.dat",os.R_OK)
>>> True

#Execute permissions
os.access("test.dat",os.X_OK)
>>> False

#And Combinations thereof
os.access("test.dat",os.R_OK or os.X_OK)
>>> True

os.access("test.dat",os.R_OK and os.X_OK)
>>> False
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文