-->

如何在Python中使用os.umask()(How to use os.umask() in Py

2019-07-29 03:34发布

我试图设置使用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)

这也不能工作。

Answer 1:

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

该方案是表现为你问它,并不一定如你认为应该。 常见的情况,即,随着计算机:-)



Answer 2:

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

[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 ,因为样本umask022创造的模式文件时, 777会导致r-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()

这给了我们:

-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 ,你的情况的权限。

这将是值得看的,当你在你的环境中运行该程序以上的结果是什么。 如果是相同的,因为我得到那么问题可能在于其他地方。



Answer 3:

被挑剔/小心,和Python 3K兼容的,这是我稍有不同的答案(这仍然没有解释什么OP原来的问题是):

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

finally:
    os.umask(old_umask)


Answer 4:

尽管这似乎是直的系统调用,在这种情况下,它似乎不管你使用的是什么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



文章来源: How to use os.umask() in Python