85

我正在尝试更改文件访问权限:

os.chmod(path, mode)

我想让它只读:

os.chmod(path, 0444)

有没有其他方法使文件只读?

4

9 回答 9

87
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)

统计

以下标志也可以在 os.chmod() 的 mode 参数中使用:

stat.S_ISUID设置 UID 位。

stat.S_ISGID设置组 ID 位。这个位有几个特殊用途。对于一个目录,它表明 BSD 语义将用于该目录:在那里创建的文件从目录继承其组 ID,而不是从创建过程的有效组 ID,并且在那里创建的目录也将设置 S_ISGID 位。对于没有设置组执行位 (S_IXGRP) 的文件,set-group-ID 位指示强制文件/记录锁定(另请参见 S_ENFMT)。

stat.S_ISVTX粘性位。当在目录上设置此位时,意味着该目录中的文件只能由文件所有者、目录所有者或特权进程重命名或删除。

stat.S_IRWXU文件所有者权限的掩码。

stat.S_IRUSR所有者具有读取权限。

stat.S_IWUSR所有者具有写入权限。

stat.S_IXUSR所有者具有执行权限。

stat.S_IRWXG组权限的掩码。

stat.S_IRGRP组具有读取权限。

stat.S_IWGRP组有写权限。

stat.S_IXGRP组具有执行权限。

stat.S_IRWXO其他人(不在组中)的权限掩码。

stat.S_IROTH其他人有阅读权限。

stat.S_IWOTH其他人有写权限。

stat.S_IXOTH其他人有执行权限。

stat.S_ENFMTSystem V 文件锁定实施。此标志与 S_ISGID 共享:对未设置组执行位 (S_IXGRP) 的文件强制执行文件/记录锁定。

stat.S_IREADS_IRUSR 的 Unix V7 同义词。

stat.S_IWRITES_IWUSR 的 Unix V7 同义词。

stat.S_IEXECS_IXUSR 的 Unix V7 同义词。

于 2013-04-27T07:45:45.490 回答
37

os.chmod(path, 0444) Python 2.x 中用于更改文件权限的 Python 命令。对于 Python 2 和 Python 3 组合解决方案,更改04440o444.

您始终可以使用 Python 调用 chmod 命令,使用subprocess. 我认为这仅适用于Linux。

import subprocess

subprocess.call(['chmod', '0444', 'path'])
于 2013-04-27T07:21:07.643 回答
34

只需在八进制中包含权限整数(适用于 python 2 和 python3):

os.chmod(path, 0o444)
于 2018-08-16T13:31:30.757 回答
20

当前的所有答案都破坏了非写入权限:它们使文件对每个人都可读但不可执行。当然,这是因为最初的问题要求444权限——但我们可以做得更好!

这是一个使所有单独的“读取”和“执行”位保持不变的解决方案。我编写了冗长的代码以使其易于理解;如果你愿意,你可以让它更简洁。

import os
import stat

def remove_write_permissions(path):
    """Remove write permissions from this path, while keeping all other permissions intact.

    Params:
        path:  The path whose permissions to alter.
    """
    NO_USER_WRITING = ~stat.S_IWUSR
    NO_GROUP_WRITING = ~stat.S_IWGRP
    NO_OTHER_WRITING = ~stat.S_IWOTH
    NO_WRITING = NO_USER_WRITING & NO_GROUP_WRITING & NO_OTHER_WRITING

    current_permissions = stat.S_IMODE(os.lstat(path).st_mode)
    os.chmod(path, current_permissions & NO_WRITING)

为什么这行得通?

正如John La Rooy 指出的那样stat.S_IWUSR基本上意味着“用户写权限的位掩码”。我们希望将相应的权限位设置为 0。为此,我们需要完全相反的位掩码(即,在该位置具有 0 的位掩码,而在其他任何地方都具有 1)。翻转所有位的~运算符正是为我们提供了这一点。如果我们通过“按位与”运算符 ( ) 将其应用于任何变量&,它会将相应的位清零。

我们也需要用“组”和“其他”权限位重复这个逻辑。&在这里,我们可以通过将它们全部组合在一起(形成NO_WRITING位常数)来节省一些时间。

最后一步是获取当前文件的权限,并实际执行按位与运算。

于 2016-07-21T17:51:42.137 回答
7

只需在权限编号前加 0:
例如 - 我们要赋予所有权限 - 777
语法: os.chmod("file_name" , permission)

import os
os.chmod("file_name" , 0777)

Python 3.7 版不支持这种语法。八进制文字需要 '0o' 前缀 - 这是我在 PyCharm 中得到的评论

所以对于python 3.7,它将是

import os
os.chmod("file_name" , 0o777)
于 2020-03-11T07:58:44.373 回答
5

仅供参考,这里是一个函数,用于将具有 9 个字符的权限字符串(例如 'rwsr-x-wt')转换为可以与os.chmod().

def perm2mask(p):
        
    assert len(p) == 9, 'Bad permission length'
    assert all(p[k] in 'rw-' for k in [0,1,3,4,6,7]), 'Bad permission format (read-write)'
    assert all(p[k] in 'xs-' for k in [2,5]), 'Bad permission format (execute)'
    assert p[8] in 'xt-', 'Bad permission format (execute other)'
    
    m = 0
    
    if p[0] == 'r': m |= stat.S_IRUSR 
    if p[1] == 'w': m |= stat.S_IWUSR 
    if p[2] == 'x': m |= stat.S_IXUSR 
    if p[2] == 's': m |= stat.S_IXUSR | stat.S_ISUID 
    
    if p[3] == 'r': m |= stat.S_IRGRP 
    if p[4] == 'w': m |= stat.S_IWGRP 
    if p[5] == 'x': m |= stat.S_IXGRP 
    if p[5] == 's': m |= stat.S_IXGRP | stat.S_ISGID 
    
    if p[6] == 'r': m |= stat.S_IROTH 
    if p[7] == 'w': m |= stat.S_IWOTH 
    if p[8] == 'x': m |= stat.S_IXOTH 
    if p[8] == 't': m |= stat.S_IXOTH | stat.S_ISVTX
    
    return m

请注意,设置 SUID/SGID/SVTX 位将自动设置相应的执行位。如果没有这个,生成的权限将是无效的(ST字符)。

于 2019-08-08T15:05:15.037 回答
3

你可以使用,pathlib 也

from pathlib import Path

fl = Path("file_name")

fl.chmod(0o444)
于 2020-04-20T17:25:28.980 回答
0

在 Python 3.4+ 中,使用pathlib.Path对象时,可以chmod()直接调用路径对象上的方法。文档中给出了以下示例:

>>> p = Path('setup.py')
>>> p.stat().st_mode
33277
>>> p.chmod(0o444)
>>> p.stat().st_mode
33060
于 2021-10-29T11:10:42.313 回答
-1

无需记住标志。请记住,您总是可以这样做:

subprocess.call(["chmod", "a-w", "file/path])

不可移植但易于编写和记忆:

  • u - 用户
  • g - 组
  • o - 其他
  • 一个 - 所有
  • + 或 -(添加或删除权限)
  • r - 读
  • w - 写
  • x - 执行

请参阅man chmod其他选项和更详细的说明。

于 2018-03-26T13:18:52.487 回答