【问题标题】:How to change file permissions using os.chmod while preserving existing permissions?如何在保留现有权限的同时使用 os.chmod 更改文件权限?
【发布时间】:2019-07-06 18:38:53
【问题描述】:

我正在尝试一次有选择地修改用户、组或其他人的权限,但每当我使用chmod 时,所有权限都会被覆盖。


我已尝试按照chmod 文档中的建议将当前文件权限与新权限组合在一起:

例如:

GROUP_RO = S_IRGRP #Group read only
current_permissions = stat.S_IMODE(os.stat(path).st_mode)

os.chmod(path, current_permissions | GROUP_RO)

我也尝试过使用位掩码。我想不出一种方法将位掩码组合到哪里 - 如果我正在修改用户权限,我可以保护/屏蔽组和其他权限不被修改。

我尝试通过以下方式使用位掩码:

GROUP_RO = S_IRGRP #Group read only
USER_MASK = S_IRWXU

os.chmod(path, USER_MASK | GROUP_RO) #this works at preventing User permissions from being modified

但将多个面具连接在一起却不会:

USER_MASK = S_IRWXU
OTHERS_MASK = S_IRWXO

os.chmod(path, USER_MASK | OTHERS_MASK | GROUP_RO) #does not work

我尝试过无数种不同的位运算符和位掩码的组合,有或没有当前权限,但没有运气。


我想做的事:

# current permissions -> U: read only, G: read and write, O: write only
os.chmod(path, [whatever code making this work])
# new permissions -> U: read only, G: read only, O: write only

在任何情况下,其他实体都不会被修改。

【问题讨论】:

  • 您显示的示例语法无效。您能否展示一个可行的示例以及您尝试使用的方法?
  • @MadPhysicist 是一个错字。我修复了它并添加了我尝试过的其他解决方案的示例。

标签: python python-3.x file-permissions chmod stat


【解决方案1】:

你所有的尝试都非常接近。问题是| 运算符不能关闭位。因此,当您执行current_permissions | S_IRGRP 时,您设置了正确的位,但您并没有关闭写入权限。

要关闭位,您需要&。有一些很好的方法可以做到这一点。

我选择的可能是取消设置所有组权限,并将它们设置为您想要的:

(current_permissions & ~S_IRWXG) | S_IRGRP

第一部分取消设置所有组权限,第二部分像以前一样应用只读模式。

另一种方法是禁用除用户和其他部分之外的所有内容,然后设置组:

(current_permissions & (S_IRWXU | S_IRWXO)) | S_IRGRP

这两者通常是等效的,除非您在权限中设置了一些奇怪的位。

【讨论】:

  • 这本质上是我可以用来独立修改用户、组或其他人的权限的公式吗? -> os.chmod((CURRENT_PERMS & ~MASK_OF_ENTITY_TO_BE_MOTIFIED)| NEW_PERMS_OF_ENTITY_TO_BE_MOTIFIED)。我必须阅读更多关于您的答案和 os.stat 的内容,以确切了解您的意思以及这些位发生了什么。
  • @Dante。是的,你明白了。就像你说的那样,解决方案是通用的。了解按位求反~、按位和& 和按位或| 做了什么,就会很清楚了。
  • 我回答了我自己的评论 - 我刚刚测试过 - 这太棒了。谢谢,我也很感谢你的解释,除了 chmod 之外,这对我有很大帮助。
猜你喜欢
  • 2022-08-17
  • 2017-04-06
  • 2011-10-13
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2012-01-29
  • 2012-04-03
相关资源
最近更新 更多