微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Python中使用os.umask

我试图设置一个使用os模块的umask。 请注意我的〜/ .profile中设置的正常的umask是umask 0027。

在bash shell中,

umask 0022

将允许创build具有权限的文件

-rw-r--r--

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

htaccessredirect到子域并保持string

如何在Fedora 11 Linux上安装Redmine

在Cent OS 7上,forticlientsslvpn不能与代理一起使用

为什么如果socket通信的另一端closures,recv()不会设置errno?

无法通过PHP脚本发送邮件

os.umask(0022) [do some other code here that creates a file]

我得到的权限

----------

首先,我如何让os.umask(mask)在shell中像umask一样运行?

其次,两者的区别是什么?

注:我试图将0022转换为十进制,以防万一要通过这样做:

os.umask(18)

但它给了权限

-----w--w-

另外请注意,我试过了

os.umask(00022)

os.mask(0o0022)

哪个也没用。

sh脚本没有findvariables

Android的源代码build立在Ubuntu 12.04

如何从自身内部获取指向程序特定部分的指针? (也许与自我)

Ubuntu 12.04 LTS:更新python 2.7.3到2.7.6而不破坏依赖关系

Linux密钥表文件进行身份validation

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

[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",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示例中,这也是明显的,因为在创建模式777的文件时, umask值为022会导致r-xr-xr-x ,而不是rw-r--r--就像你拥有它。

根据你的意见,你指出你使用的是open而不是os.open ,粗略地看一下Python源码似乎表明这转换成了一个使用0666作为初始模式的C fopen调用。 稍有修改代码支持这一点:

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

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

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

import os oldmask = os.umask (022) fh1 = os.open ("qq1.junk",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 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 rx rx 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

程序按照您的要求行事,不一定像您认为的那样。 常见的情况是,用电脑:-)

挑剔/小心,和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更接近于操作系统,而3.x做了更多的抽象。

https://docs.python.org/2/library/os.html “认模式是0777(八进制),并且当前的umask值首先被屏蔽掉。

在https://docs.python.org/3/library/os.html中没有类似的声明

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐