你如何在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 中创建具有分类特征的易于解释的回归模型?