如何在Python中使用os.umask()

nar*_*nie 12 python linux umask

我正在尝试使用os模块设置umask.请注意我在〜/ .profile中设置的普通umask是umask 0027.

在bash shell中,

umask 0022
Run Code Online (Sandbox Code Playgroud)

将允许使用权限创建文件

-rw-r--r--
Run Code Online (Sandbox Code Playgroud)

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

os.umask(0022)
[do some other code here that creates a file]
Run Code Online (Sandbox Code Playgroud)

我获得了权限

----------
Run Code Online (Sandbox Code Playgroud)

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

第二,两者之间的差异是什么?

注意:我尝试将0022转换为十进制,以防它通过执行以下操作来预期小数:

os.umask(18)
Run Code Online (Sandbox Code Playgroud)

但它赋予了权限

-----w--w-
Run Code Online (Sandbox Code Playgroud)

还要注意,我试过了

os.umask(00022)
Run Code Online (Sandbox Code Playgroud)

os.mask(0o0022)
Run Code Online (Sandbox Code Playgroud)

哪个也没用.

Jim*_*H44 18

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

import os
oldmask = os.umask (0o22)
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)
Run Code Online (Sandbox Code Playgroud)

应该确实生成如下文件:

-rwxr-xr-x 1 pax pax 0 Apr 24 11:11 qq1.junk
---------- 1 pax pax 0 Apr 24 11:11 qq2.junk
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

该程序的行为与您所要求的一样,不一定如您所想.常见的情况,用电脑:-)


pax*_*blo 8

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

[do some other code here that creates a file]
Run Code Online (Sandbox Code Playgroud)

您的代码在我的系统上正常工作:

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)
Run Code Online (Sandbox Code Playgroud)

生成文件如下:

-rwxr-xr-x 1 pax pax 0 Apr 24 11:11 qq1.junk
---------- 1 pax pax 0 Apr 24 11:11 qq2.junk
Run Code Online (Sandbox Code Playgroud)

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

从上面的结果中可以看出,您还需要知道umask从您用于创建文件的模式中"减去" 该值,我们不知道您的特定情况下该模式是什么.

即使在您的bash样本中也是如此,因为创建模式文件时的umask值会导致,而不是您拥有它.022777r-xr-xr-xrw-r--r--


根据您在下面的注释,您指出您正在使用open而不是os.open,粗略地看一眼Python源似乎表明这转换为C fopen调用,它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()
Run Code Online (Sandbox Code Playgroud)

这给了我们:

-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
Run Code Online (Sandbox Code Playgroud)

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

当你在你的环境中运行上面的程序时,值得看看结果是什么.如果它与我得到的相同,那么问题可能就在其他地方.


Geo*_*und 5

挑剔/小心,兼容Python 3k,这是我稍微不同的答案(仍然无法解释OP的原始问题):

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

finally:
    os.umask(old_umask)
Run Code Online (Sandbox Code Playgroud)