你如何在python中创建一个具有其他用户可以写入权限的文件

Posted

技术标签:

【中文标题】你如何在python中创建一个具有其他用户可以写入权限的文件【英文标题】:How do you create in python a file with permissions other users can write 【发布时间】:2016-08-13 05:40:51 【问题描述】:

我如何在 python (3) 中创建一个其他用户也可以编写的文件。 到目前为止,我已经这样做了,但它改变了

os.chmod("/home/pi/test/relaxbank1.txt", 777)
with open("/home/pi/test/relaxbank1.txt", "w") as fh:
    fh.write(p1)  

我得到了什么

---sr-S--t 1 root root 12 Apr 20 13:21 Relaxbank1.txt

预期(在命令行中执行后 $ sudo chmod 777 Relaxbank1.txt )

-rwxrwxrwx 1 root root 12 Apr 20 13:21 Relaxbank1.txt

【问题讨论】:

如果将chmod 放在with 块之后会发生什么? 权限号是八进制,试试0777! os.chmod("/home/pi/test/relaxbank1.txt", 0777) ^ SyntaxError: invalid token 0777 给出错误 克劳斯 D. 仍然生活在上个世纪。正确的合成器是 0o777。但你也可以写 511、0x1ff 或 0b111111111,因为所有这些文字都解析为同一个整数。整数对象是一个值的纯粹表示,只要你不写它就没有特殊格式。 【参考方案1】:

问题是您对open() 的调用会重新创建调用。关闭文件后需要将chmod()移动到,或者将文件模式更改为w+

选项1:

with open("/home/pi/test/relaxbank1.txt", "w+") as fh:
    fh.write(p1)
os.chmod("/home/pi/test/relaxbank1.txt", 0o777)

选项2:

os.chmod("/home/pi/test/relaxbank1.txt", 0o777)
with open("/home/pi/test/relaxbank1.txt", "w+") as fh:
    fh.write(p1)

评论:Option1 稍微好一点,因为它处理文件可能不存在的情况(在这种情况下,os.chmod() 将抛出异常)。

【讨论】:

建议的“0777”给出错误:os.chmod("/home/pi/test richard/relaxbank1.txt",0777) 错误消息:SyntaxError: invalid token 但是“777”不要t 给出错误但在 -r----x--t 1 root root 12 Apr 20 15:37 Relaxbank1.txt 中更改权限 ^ 我的错——正确的八进制表示法是 0o777(零,字母 'o',777) 0o777 中的0o 是什么意思? 啊,我明白了,对于那些想知道0o777 中领先的0o 的人,它是让数字八进制见this post 这个答案可能对未来的读者危险。这只是安全的,因为 OP 要求将权限更改为 限制较少。未来的读者要注意,如果您想让权限更具限制性,这并不安全。这是因为在创建文件和更改权限之间存在时间。因此,恶意代理可能能够在权限更改之前打开文件并使其保持打开状态。请参阅此处获取安全解决方案:***.com/a/45368120/453851【参考方案2】:

如果您不想使用os.chmod 并且希望使用适当的权限创建文件,那么您可以使用os.open 创建适当的文件描述符,然后使用open 描述符:

import os
# The default umask is 0o22 which turns off write permission of group and others
os.umask(0)
with open(os.open('filepath', os.O_CREAT | os.O_WRONLY, 0o777), 'w') as fh:
  fh.write(...)

Python 2 注意:

Python 2.x 中内置的open() 不支持通过文件描述符打开。请改用os.fdopen;否则你会得到:

TypeError: coercing to Unicode: need string or buffer, int found.

【讨论】:

这是比公认答案更好的方法。当您需要创建比默认 umask 具有更多限制性权限的文件时,在创建文件后更新权限是一个安全漏洞。 错误:“类型错误:强制转换为 Unicode:需要字符串或缓冲区,找到 int” Peter Krauss:这是 python2 的问题。答案已更新。感谢@alexdelisle 提出修复建议。 这个方案更加优雅美观。 这是更好的选择,我将其更改为接受的答案。感谢您努力与我们分享这一点。【参考方案3】:

这是一种稳健的方法

#!/usr/bin/env python3
import stat
import os
path = 'outfile.txt'
with open(path, 'w') as fh:
    fh.write('blabla\n')
st = os.stat(path)
os.chmod(path, st.st_mode | stat.S_IWOTH)

看看如何:

使用stat.S_IWOTH 代替原始二进制常量,这样更符合语义 我们只在文件中添加一个+o,默认使用umask,另见:How do you do a simple "chmod +x" from within python?

另见:Write file with specific permissions in Python

【讨论】:

【参考方案4】:

与 AXO 的想法类似,最好使用正确的权限创建文件,open()opener 参数似乎非常方便。

import os

def opener(path, flags):
    return os.open(path, flags, 0o777)

os.umask(0)  # Without this, the created file will have 0o777 - 0o022 (default umask) = 0o755 permissions
with open("myfile.txt", "w", opener=opener) as f:
    f.write("myline")

来自documentation for opener

可以通过将可调用对象作为开启器传递来使用自定义开启器。然后通过使用 (file, flags) 调用 opener 来获取文件对象的底层文件描述符。 opener 必须返回一个打开的文件描述符(将 os.open 作为 opener 传递会产生类似于传递 None 的功能)。

【讨论】:

以上是关于你如何在python中创建一个具有其他用户可以写入权限的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中创建具有多行的行

如何在 Python 中创建具有分类特征的易于解释的回归模型?

在python中如何创建角色?

如何在 Java 中创建一个 zip 文件

如何使用 REST API 在 Keycloak 中创建具有密码的用户?

在 Laravel 中创建具有角色的用户时需要帮助