我试图设置使用OS模块的umask。 请注意我的正常的umask在我的〜/ .profile文件设置为的umask 0027。
在bash shell,
umask 0022
将允许使用的权限创建一个文件
-rw-r--r--
然而,当我们导入os模块,并做到这一点:
os.umask(0022)
[do some other code here that creates a file]
我得到的权限
----------
首先,如何让我os.umask(面具)的行为就像在shell的umask?
二,什么是两者的差异之间的逻辑是什么?
注:我尝试转换0022到小数点在它被期望做一个小数情况下:
os.umask(18)
但它给的权限
-----w--w-
另外请注意,我试过
os.umask(00022)
和
os.mask(0o0022)
这也不能工作。
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)
其实应该产生的文件如下:
-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
该方案是表现为你问它,并不一定如你认为应该。 常见的情况,即,随着计算机:-)
你可能需要向我们展示构成的代码:
[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
值022
创造的模式文件时, 777
会导致r-xr-xr-x
不rw-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()
这给了我们:
-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
,你的情况的权限。
这将是值得看的,当你在你的环境中运行该程序以上的结果是什么。 如果是相同的,因为我得到那么问题可能在于其他地方。
被挑剔/小心,和Python 3K兼容的,这是我稍有不同的答案(这仍然没有解释什么OP原来的问题是):
old_umask = os.umask(0o022) # u=rwx,g=rx,o=rx
try:
# do stuff
finally:
os.umask(old_umask)
尽管这似乎是直的系统调用,在这种情况下,它似乎不管你使用的是什么Python版本:
看来,os.open处理预存在Python 2.x和Python 3.x都有不同的umask,这可能是因为2.X更接近OS和3.x做多一点抽象。
https://docs.python.org/2/library/os.html “默认模式是0777(八进制),并且当前的umask值首先掩蔽掉”。
有没有类似的声明中https://docs.python.org/3/library/os.html