Python的os.open()无法将umask设置为777(最大为755)

3
我的 Python 脚本如果文件不存在就创建一个文件,然后读取并写入该文件。脚本可能由 root(自动运行)或用户(刷新请求)运行。我需要创建带有写许可权限的文件,以便在两种情况下都可以重新编写该文件。
import os
f = os.open('file', os.O_CREAT, 0777)
os.close(f)

但是接着...
$ ls -l
-rwxr-xr-x 1 pi pi  0 Feb 22 13:51 file

然而,这个脚本可以运行,我不理解其中的区别:
import os  
f = os.open('file', os.O_CREAT)
os.fchmod(f, 0777)
os.close(f)

...然后:

$ ls -l
-rwxrwxrwx 1 pi pi  0 Feb 22 13:54 file

请注意,0777 实际上是默认的 mode - jonrsharpe
使用 sudo python test.pypython test.py 命令会得到相同的结果。 - pinhead
@jonrsharpe,即使没有第三个参数,我仍然得到rwxr-xr-x(755)。 - pinhead
1个回答

5
您不是在设置umask,而是在设置文件模式位,这些位被umask掩码覆盖。根据文档

打开文件文件并根据标志设置各种标志,可能根据模式设置其模式。默认模式为0777(八进制),当前umask值首先被掩码。…

您的umask值似乎是0022,因此掩盖了组和其他用户的写权限。

此处内容:

os.fchmod(f, 0777)

尽管umask值存在,但显式地将文件权限设置为0777


啊啊啊,好的,所以在这个一行代码中,如果我想要创建一个权限为777的文件,第三个参数应该是什么? - pinhead
@pinhead - 要么这样做,要么显式地将 umask 设置为零。请注意,设置 umask 将影响您在进程中进行的所有操作。如果您正在运行单线程应用程序,则并不是很重要,因为您可以将 umask 重置,但在多线程应用程序中,它可能会产生影响。 - Andrew Henle
@pinhead,除非在使用umask 000的环境中运行,否则没有办法用一行代码实现这个功能(这是很危险的)。 - BingsF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接