在Python中更改文件权限


68

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

os.chmod(path, mode)

我想将其设为只读:

os.chmod(path, 0444)

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


我看过一些像S_IRUSR ..这是如何工作的???
Abul Hasnat

我认为它只是设置了一点,所以当您或他们在一起时,您会得到0444
Joran Beasley

3
如果您想问“我如何使用符号许可名称以及它们的含义”,那么您的发音存在严重缺陷。
Tripleee

@AbulHasnat。你有什么解决办法吗?
avinash

Answers:


76
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位置1。对于未设置组执行位(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_IREAD Unix V7的S_IRUSR同义词。

stat.S_IWRITE Unix V7的S_IWUSR同义词。

stat.S_IEXEC Unix V7的S_IXUSR同义词。


9
常量stat只是方便人类阅读的糖。S_IRUSR是0400,S_IRGRP是040,S_IROTH是4;将它们与按位OR组合会产生0444。您可以改为将它们相加,但在一般情况下,OR是正确的,因为即使有重叠的位(0444 OR 0444为0444,它也可以工作,而相加会产生不同且错误的值)。
Tripleee

使用+似乎也可以代替|。我不知道是否有理由在另一个之上使用一个。
Brōtsyorfuzthrāx

1
对此没有任何解释,除非您已经知道stat的功能,否则您必须阅读注释,注释或链接以理解它。只需稍作解释,它就会变得更好。
DonyorM

2
|当组合来自两个位掩码的位时,@ Shule更合适。但是,如果每个掩码只有一个单独的,单独的位集(如上述答案中的所有常量),则+是等效的。
ws_e_c421's

+操纵预先存在的模式时,您必须小心机智。如果已经设置了模式,+则将无法使用,但|可以。例如,mode = stat.S_IWUSR + stat.S_IRUSR; ... some code ...; mode = mode + stat.S_IWUSR;将无法使用,但最后一个命令将与一起使用|
mxmlnkn19年

34

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

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

import subprocess

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

2
os.chmod可能是正确的函数,但是0444(in os.chmod(path, 0444))作为int会引起SyntaxError(由于前导0),并且以字符串形式不会产生预期的效果。您必须将数字转换为该方法使用的数字系统,这是不一样的。也许您知道,但是其他人可能不知道。
Brōtsyorfuzthrāx

3
没关系我的评论!对不起,Inbar玫瑰。你没事。显然,0444在Python 2.x中运行良好。但是,它会在Python 3.x中导致SyntaxError。要解决此问题,只需在Python 3.x中执行0o444即可。
Brōtsyorfuzthrāx

这不适用于另一台服务器上的文件。您能为这种情况提出建议吗?谢谢
Neo

产生八进制数字的版本不可知的方式是:int(“ 444”,8)但是,请注意,另一个答案建议使用stat模块中定义的符号值可能更干净。
YitzikC


18

当前所有答案都破坏了非写权限:它们使文件对所有人可读,但不能执行。当然,这是因为最初的问题要求获得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位常量)来节省一些时间。

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


似乎必须有一种更简洁的方法来执行此操作。
Catskul

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)

1

您可以使用,pathlib也可以

from pathlib import Path

fl = Path("file_name")

fl.chmod(0o444)

0

无需记住标志。请记住,您可以随时执行以下操作:

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

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

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

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


4
这种方法的关键问题是它假定它在类Unix系统上。这不能移植,因为它在Windows上不起作用。您应该按照os.chmodGitano的答案中的建议使用。
–'code_dredd

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字符)。

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.