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)
该程序的行为与您所要求的一样,不一定如您所想.常见的情况,用电脑:-)
您可能需要向我们展示构成的代码:
[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在你的情况下获得权限.
当你在你的环境中运行上面的程序时,值得看看结果是什么.如果它与我得到的相同,那么问题可能就在其他地方.
挑剔/小心,兼容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)