tempfile.mkstemp 权限设置

3
我正在使用tempfile.mkstemp来生成一个随机的可用文件名,并使用os.fdopen写入一些内容。然后,我通过celery将文件名传递给任务。 这个任务打开文件,处理内容,最后删除文件。在测试中这很好用,但我意识到在我的实际环境中会出现问题,因为运行任务的用户与创建文件的用户不同。
这意味着用户无法打开文件,因为tempfile.mkstemp设置了许可权限为600(-rw-------)。
我不能让两个进程运行在同一个用户下,所以有没有一种方法可以修改由tempfile.mkstemp设置的文件权限?
我正在Ubuntu 14.04上运行Python 3.6。

我建议你在有问题时先阅读文档,然后再来StackOverflow。 - robobrobro
@robobrobro,我很感激你的观点,但是我确实阅读了那份文档,但我没有看到有关文件权限的明确说明。 - PyPingu
该文件只能被创建用户ID读写。如果平台使用权限位来指示文件是否可执行,则该文件无法被任何人执行。 - robobrobro
好的,虽然我认为不清楚是否可以更改?看起来唯一的方法可能是os.chmod - PyPingu
2个回答

4

假设您在调用mkstemp()之后使用os.fdopen,最好使用tempfile.NamedTemporaryFile(delete=False)。它返回一个Python文件对象而不是fd。

无论哪种方式,返回的文件都将具有mode=0600,因此您需要更改它。使用os.fchmod(temp_file.fileno(), 0640)或类似方法(根据需要更改模式)。


我接受了你的解释关于 os.chmod 问题,谢谢。 - PyPingu

3
除了使用chmod命令手动修改权限外,没有其他方法可以修改由tempfile.mkstemp创建的文件的权限。这个函数的设计是以最安全的方式创建临时文件,因此文件只能被创建用户ID读取和写入。请参见mkstemp文档
相反地,您可以使用tempfile.TemporaryFiletempfile.NamedTemporaryFile来创建您的临时文件。

好的,我认为这可能是情况,你觉得使用tempfile.NamedTemporaryFile还是在mkstemp文件上使用os.fchmod更好? - PyPingu
我会使用NamedTemporaryFile。看着你的用例,实际上你并不需要安全的临时文件。因此使用tempfile.mkstemp没有意义。 - running.t
1
NamedTemporaryFile和tempfile.mkstemp一样安全 - 它们在内部使用相同的代码。调用NamedTemporaryFile(delete = False)以获取mkstemp()行为,以及Python文件对象(无论如何都需要)。 - Leo K
似乎NamedTemporaryFile也会创建0600权限模式的文件。 - PyPingu
你是对的。所有三个函数mkstempTemporaryFileNamedTemporaryFile实际上都使用同一个内部函数来创建文件。并且006模式在那里被硬编码了。这里可以找到一些解决方法。 - running.t

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