Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在保留现有权限的同时使用os.chmod更改文件权限?_Python_Python 3.x_File Permissions_Chmod_Stat - Fatal编程技术网

Python 如何在保留现有权限的同时使用os.chmod更改文件权限?

Python 如何在保留现有权限的同时使用os.chmod更改文件权限?,python,python-3.x,file-permissions,chmod,stat,Python,Python 3.x,File Permissions,Chmod,Stat,我试图一次选择性地修改用户、组或其他人的权限,但每当我使用chmod时,所有权限都会被覆盖 我已尝试按照chmod文档中的建议,将当前文件权限与新权限组合在一起: 例: 我也试过使用比特面具。我无法找到将位掩码组合到何处的方法-如果我正在修改用户权限,我可以保护/屏蔽组和其他人的权限不被修改 我尝试过以下方式使用位掩码: GROUP_RO = S_IRGRP #Group read only USER_MASK = S_IRWXU os.chmod(path, USER_MASK | GRO

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


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

例:

我也试过使用比特面具。我无法找到将位掩码组合到何处的方法-如果我正在修改用户权限,我可以保护/屏蔽组和其他人的权限不被修改

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

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

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

您显示的示例具有无效语法。你能给我举一个工作的例子,看看你用面具做了什么吗?@MadPhysicast twas是个打字错误。我修复了它,并添加了我尝试过的其他解决方案的示例。这本质上是我可以用来独立修改用户、组或其他人权限的公式吗?->os.chmod((实体的当前映射和掩码映射)实体的新映射)。“我必须阅读更多关于你的答案和os.stat的资料,才能确切地了解你的意思,以及这些信息是怎么回事。”但丁。是的,你大概知道了。正如你所说,解决方案是通用的。理解按位求反
~
、按位和
&
以及按位或
|
的作用,它会变得非常清楚。我回答了我自己的评论-我刚刚测试了它-这太棒了。谢谢你,我也很感谢你的解释,除了chmod,这对我帮助很大。
(current_permissions & (S_IRWXU | S_IRWXO)) | S_IRGRP