python - 如何在保留现有权限的同时使用 os.chmod 更改文件权限?
问题描述
我试图一次有选择地修改用户、组或其他人的权限,但每当我使用 时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
在任何情况下,其他实体都不会被修改。
解决方案
你所有的尝试都非常接近。问题是|
操作员不能关闭位。所以当你这样做时current_permissions | S_IRGRP
,你设置了正确的位,但你没有关闭写权限。
要关闭位,您需要&
. 有一些很好的方法可以做到这一点。
我选择的可能是取消设置所有组权限,并将它们设置为您想要的:
(current_permissions & ~S_IRWXG) | S_IRGRP
第一部分取消设置所有组权限,第二部分像以前一样应用只读模式。
另一种方法是禁用除用户和其他部分之外的所有内容,然后设置组:
(current_permissions & (S_IRWXU | S_IRWXO)) | S_IRGRP
除非您在权限中设置了一些奇怪的位,否则两者通常是等效的。
推荐阅读
- responsive-design - 移动与。桌面行显示
- regex - 有没有办法让字符匹配字符类的结合?
- python-3.x - Python在(引用的)命令字符串中执行带有变量的shell命令
- python - 如何根据字符串在两行之间提取文本文件中的行
- javascript - 将数组与一周中的几天向后移动一天js
- sqlite - 如何将 NON-CSV-DELIMITED ASCII 数据导入 SQLite 3?
- wordpress - 将自定义字段添加到运输选项卡中的 WooComerce 产品设置页面,并根据值应用自动计算
- javascript - 如果我使用 Cypress-cucumber 对两个不同的示例使用两个不同的标签,会出现错误?
- r - 减少 ggplot 图例的 R 表达式中 frac 的间距
- reactjs - 尝试将 Firebase 与 React 一起使用时出现问题