使用os.chmod删除特定权限

11

如何使用os.chmod为所有人删除特定的权限?

简而言之,我们如何使用os.chmod编写以下代码

chmod a-x filename

我知道我们可以给现有的权限添加权限,也可以删除。

In [1]: import os, stat
In [5]: os.chmod(file, os.stat(file).st_mode | stat.S_IRGRP)  # Make file group readable.

但是我无法弄清楚执行所有操作的方法


想一想 chmod 如何实现这个功能;它需要采取哪些步骤来从现有的八进制权限值中删除一个权限? - Martijn Pieters
不是取反,而是对这些值进行异或操作。感谢你的理解。谢谢。 - baky
2个回答

20
很棒。所以秘密在于您首先需要获取当前权限。这有点混乱,但它可行。
current = stat.S_IMODE(os.lstat("x").st_mode)

这个想法是使用lstat.st_mode获取标志,但需要将其裁剪到chmod可接受的范围内:

help(stat.S_IMODE)
#>>> Help on built-in function S_IMODE in module _stat:
#>>>
#>>> S_IMODE(...)
#>>>     Return the portion of the file's mode that can be set by os.chmod().
#>>>

然后你可以使用一些位运算操作去除stat.S_IEXEC标志,这将给你一个新的数字来使用:

那么您可以使用一些位运算操作来去除stat.S_IEXEC标志,这将为您提供新的数字以使用:

os.chmod("x", current & ~stat.S_IEXEC)

如果您对位运算不熟悉,& 只会取两个数字共有的那些位,~ 会反转一个数字的所有位。所以 x & ~y 会取得 x 有而 y 没有 的那些位。


-1
如果您想使用os.chmod(),则可以使用以下代码:
import os
for dir_path, dir_names, files in os.walk('.'):
        for file in files:
            abs_path = os.path.join(dirpath, file)
            os.chmod(abs_path, 0o755) 

这绝对不是问题的本意。 'chmod a-x 文件名'表示从所有用户(用户所有者、组所有者和其他人)中撤销给定文件名的可执行权限。 - baky
你想为用户所有者、组所有者和其他人提供什么权限?我知道所有人都不应该有执行权限,那读取和写入权限呢?告诉我后我会进行更改。 - Nikhil Gupta
导入 os 对于 dir_path、dir_names 和 files 在 os.walk('.') 中: 对于 file in files: abs_path = os.path.join(dirpath, file) os.chmod(abs_path, 0o644) # 它将为所有者提供读写权限,其他用户只能读取 - Nikhil Gupta
仅供您好奇:「读写权限怎么办?」这个问题意味着从所有用户中删除文件的可执行权限。这理论上意味着我们应该保留文件之前拥有的其他权限。再次提问,为什么要使用 os.walk('.')?问题只涉及一个文件,而不是整个目录。 - baky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接