18

我正在尝试使用 os 模块设置 umask。请注意我在 ~/.profile 中设置的正常 umask 是 umask 0027。

在 bash shell 中,

umask 0022

将允许创建具有权限的文件

-rw-r--r--

但是,当我们导入 os 模块并执行此操作时:

os.umask(0022)
[do some other code here that creates a file]

我获得了以下权限

----------

首先,如何让 os.umask(mask) 在 shell 中表现得像 umask?

二、两者区别的逻辑是什么?

注意:我尝试将 0022 转换为十进制,以防它通过以下方式期待小数:

os.umask(18)

但它授予了以下权限

-----w--w-

另请注意,我试过

os.umask(00022)

os.mask(0o0022)

这也不起作用。

4

4 回答 4

24

我认为对umask的误解。umask 设置默认拒绝,而不是默认权限。所以

import os
oldmask = os.umask (0o022)
fh1 = os.open ("qq1.junk", os.O_CREAT, 0o777)
fh2 = os.open ("qq2.junk", os.O_CREAT, 0o022)
os.umask (oldmask)
os.close (fh1)
os.close (fh2)

确实应该产生如下文件:

-rwxr-xr-x 1 pax pax 0 Apr 24 11:11 qq1.junk
---------- 1 pax pax 0 Apr 24 11:11 qq2.junk

umask 022 删除了组和其他人的写访问权限,这正是我们在那里看到的行为。我发现回到八进制数字所代表的二进制是有帮助的:

 usr grp others 
-rwx rwx rwx is represented in octal as 0777, requested for qq1.junk
-000 010 010 umask of 022 removes any permission where there is a 1
-rwx r-x r-x is the result achieved requesting 0777 with umask of 022

---- -w- -w- is represented in octal as 0022, requested for qq2.junk
-000 010 010 umask of 022 removes any permission where there is a 1
---- --- --- is the result achieved requesting 0022 with umask of 022

程序按照您的要求运行,不一定按照您认为的那样运行。常见的情况,用电脑:-)

于 2015-04-23T23:22:39.210 回答
8

您可能需要向我们展示构成的代码:

[do some other code here that creates a file]

您的代码在我的系统上运行良好:

import os
oldmask = os.umask (022)
fh1 = os.open ("qq1.junk", os.O_CREAT, 0777)
fh2 = os.open ("qq2.junk", os.O_CREAT, 0022)
os.umask (oldmask)
os.close (fh1)
os.close (fh2)

生成文件如下:

-rwxr-xr-x 1 pax pax 0 Apr 24 11:11 qq1.junk
---------- 1 pax pax 0 Apr 24 11:11 qq2.junk

您还应该注意旧umask值的恢复,从而最大限度地减少将其更改为本地操作的影响。

正如您从上面的结果中看到的那样,您还需要注意该umask值是从您用于创建文件的模式中“减去”的,我们不知道在您的特定情况下该模式是什么。

即使在您的bash示例中也很明显,因为创建模式文件时的umask值会导致,而不是您所拥有的。022777r-xr-xr-xrw-r--r--


根据您在下面表明您使用open而不是的评论os.open,粗略地浏览一下 Python 源代码似乎表明这转换为用作初始模式的 Cfopen调用。0666稍作修改的代码支持这一点:

import os
oldmask = os.umask (022)
fh3 = open ("qq3.junk", "w")
os.umask (0)
fh4 = open ("qq4.junk", "w")
os.umask (oldmask)
fh3.close()
fh4.close()

这给了我们:

-rw-r--r-- 1 pax pax 0 Apr 24 11:44 qq3.junk
-rw-rw-rw- 1 pax pax 0 Apr 24 11:44 qq4.junk

所以我不完全确定你为什么会0000在你的情况下获得权限。

当您在您的环境中运行上述程序时,看看结果如何是值得的。如果它与我得到的相同,那么问题很可能出在其他地方。

于 2012-04-24T02:57:50.457 回答
8

挑剔/小心,并且与 Python 3k 兼容,这是我略有不同的答案(仍然没有解释 OP 的原始问题是什么):

old_umask = os.umask(0o022) # u=rwx,g=rx,o=rx
try:
    # do stuff

finally:
    os.umask(old_umask)
于 2012-12-07T12:26:43.890 回答
0

尽管这似乎是一个直接的系统调用,但在这种情况下,您使用的 Python 版本似乎很重要:

似乎 os.open 在 Python 2.x 和 Python 3.x 中处理预先存在的 umask 的方式不同,可能是因为 2.x 更接近操作系统,而 3.x 做了更多的抽象。

https://docs.python.org/2/library/os.html “默认模式为0777(八进制),当前umask值先被屏蔽掉。

https://docs.python.org/3/library/os.html中没有类似的说法

于 2016-03-23T19:16:35.610 回答