在Python中更改文件权限

时间:2013-04-27 07:17:12

标签: python file-permissions

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

os.chmod(path, mode)

我想把它变为只读:

os.chmod(path, 0444)

还有其他方法可以将文件设为只读吗?

8 个答案:

答案 0 :(得分:59)

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

stat

  

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

     

stat.S_ISUID设置UID位。

     

stat.S_ISGID Set-group-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_ENFMT System V文件锁定执行。此标志是共享的   使用S_ISGID:对不存在的文件强制执行文件/记录锁定   设置组执行位(S_IXGRP)。

     

stat.S_IREAD Unix V7 S_IRUSR的同义词。

     

stat.S_IWRITE Unix V7 S_IWUSR的同义词。

     

stat.S_IEXEC Unix V7 S_IXUSR的同义词。

答案 1 :(得分:27)

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

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

import subprocess

subprocess.call(['chmod', '0444', 'path'])

答案 2 :(得分:14)

所有当前的答案都破坏了非写入权限:它们使文件对每个人都可读但不可执行。当然,这是因为最初的问题要求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 pointed outstat.S_IWUSR基本上意味着“用户写入权限的位掩码”。我们希望将相应的权限位设置为0.为此,我们需要完全相反的位掩码(即,在该位置具有0,在其他地方为1)。翻转所有位的~运算符给出了我们的确切结果。如果我们通过“按位和”运算符(&)将其应用于任何变量,它将把相应的位清零。

我们需要使用“group”和“other”权限位重复此逻辑。在这里,我们可以节省一些时间,只需&将它们组合在一起(形成NO_WRITING位常数)。

最后一步是get the current file's permissions,实际执行按位和操作。

答案 3 :(得分:11)

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

os.chmod(path, 0o444)

答案 4 :(得分:2)

只需在许可号码前添加0:
例如-我们要授予所有权限-777
语法:os.chmod(“ file_name”,权限)

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

Python 3.7版不支持此语法。八进制文字要求使用“ 0o”前缀-这是我在PyCharm中获得的注释

因此对于python 3.7,它将是

import os
os.chmod("file_name" , 0o777)

答案 5 :(得分:1)

您也可以使用pathlib

from pathlib import Path

fl = Path("file_name")

fl.chmod(0o444)

答案 6 :(得分:0)

无需记住旗帜。请记住,您始终可以这样做:

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

不便携但易于编写和记忆:

  • u - user
  • g - group
  • o - 其他
  • a - 全部
  • +或 - (添加或删除权限)
  • r - 阅读
  • w - 写
  • x - 执行

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

答案 7 :(得分:0)

此处仅供参考,此函数可将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个字符)。