我试图一次有选择地修改用户,组或其他用户的权限,但是每当我使用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
在任何情况下,其他实体都不会被修改。
答案 0 :(得分:1)
所有尝试都非常接近。问题是|
运算符无法关闭位。因此,当您执行current_permissions | S_IRGRP
时,您在设置正确的位,但是没有关闭写权限。
要关闭位,您需要&
。有几种好的方法可以做到这一点。
我选择的一个可能是取消设置所有组权限,然后将它们设置为所需的值:
(current_permissions & ~S_IRWXG) | S_IRGRP
第一部分取消所有组权限,第二部分像以前一样应用只读模式。
另一种方法是禁用除用户和其他部分以外的所有内容,然后设置组:
(current_permissions & (S_IRWXU | S_IRWXO)) | S_IRGRP
除非您在权限中设置了一些奇怪的地方,否则两者通常是等效的。