首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中使用os.umask()

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

Stack Overflow用户
提问于 2012-04-24 02:48:50
回答 4查看 45.7K关注 0票数 20

我正在尝试使用os模块设置一个umask。请注意我在我的~/.配置文件中设置的普通umask是umask 0027。

在弹壳里,

代码语言:javascript
运行
复制
umask 0022

将允许使用权限创建文件。

代码语言:javascript
运行
复制
-rw-r--r--

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

代码语言:javascript
运行
复制
os.umask(0022)
[do some other code here that creates a file]

我获得…的许可

代码语言:javascript
运行
复制
----------

首先,如何使os.umask(掩码)在外壳中表现得像umask?

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

注意:我尝试将0022转换为小数点,以防它期望小数点:

代码语言:javascript
运行
复制
os.umask(18)

但它赋予了

代码语言:javascript
运行
复制
-----w--w-

还要注意,我试过

代码语言:javascript
运行
复制
os.umask(00022)

代码语言:javascript
运行
复制
os.mask(0o0022)

也不起作用。

EN

回答 4

Stack Overflow用户

发布于 2015-04-23 23:22:39

我想是对乌木斯克的误解。umask设置默认的拒绝,而不是默认的权限。所以

代码语言:javascript
运行
复制
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)

确实应该按以下方式生成文件:

代码语言:javascript
运行
复制
-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删除了对组和其他人的写访问,这正是我们在那里看到的行为。我发现回到八进制数字所代表的二进制数是有帮助的:

代码语言:javascript
运行
复制
 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

这个节目是按照你的要求做的,而不一定像你想的那样。常见的情况是,对于计算机:-)

票数 29
EN

Stack Overflow用户

发布于 2012-12-07 12:26:43

由于挑剔/谨慎,并且Python 3k兼容,以下是我的略有不同的答案(这仍然不能解释OP最初的问题是什么):

代码语言:javascript
运行
复制
old_umask = os.umask(0o022) # u=rwx,g=rx,o=rx
try:
    # do stuff

finally:
    os.umask(old_umask)
票数 9
EN

Stack Overflow用户

发布于 2012-04-24 02:57:50

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

代码语言:javascript
运行
复制
[do some other code here that creates a file]

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

代码语言:javascript
运行
复制
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)

产生文件如下:

代码语言:javascript
运行
复制
-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示例中,这也很明显,因为在创建模式777文件时,022umask值将导致r-xr-xr-x,而不是您所拥有的rw-r--r--

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

代码语言:javascript
运行
复制
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()

这给了我们:

代码语言:javascript
运行
复制
-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权限。

当您在您的环境中运行上述程序时,值得看看结果是什么。如果它和我得到的一样,那么问题很可能就在别的地方。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10291131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档