【问题标题】:os.open doesn't create files with the given permission modeos.open 不创建具有给定权限模式的文件
【发布时间】:2018-11-20 10:00:51
【问题描述】:

当尝试使用 os.open 以 777 模式打开文件时(意思是允许一切)-

os.open("/tmp/lol", flags=(os.O_CREAT), mode=0o777)

它会像这样在没有写权限的情况下创建文件-

-rwxrwxr-x  1 cybellum cybellum       0 Nov 20 09:38 lol*

当尝试使用 chmod("/tmp/lol", 0o777) 时,文件获得了正确的权限:

-rwxrwxrwx  1 cybellum cybellum       0 Nov 20 09:38 lol*

为什么 os.open 不能按预期工作?
有没有办法以 777 模式创建文件(如果文件存在,它只会更改权限..(因为我尝试了 pathlib.Path.touch))?

【问题讨论】:

    标签: python linux chmod pathlib


    【解决方案1】:

    当您使用open 创建文件时,open 调用中指定的权限将由您的umask 设置修改。 umask 定义了“屏蔽”的位。在我的系统上,看起来我当前的umask0002

    $ umask
    0002
    

    这意味着当我运行像你这样的代码时:

    import os
    os.open('testfile', flags=(os.O_CREAT), mode=0o777)
    

    我会得到以下行为:

    $ python filetest
    $ ls -l testfile
    -rwxrwxr-x. 1 lars lars       0 Nov 20 07:47 testfile
    

    我可以将umask 设置为不同的值来控制权限 默认应用:

    $ umask 022
    $ python filetest
    $ ls -l testfile
    -rwxr-xr-x. 1 lars lars 0 Nov 20 07:49 testfile
    

    或者:

    $ umask 077
    $ python filetest.py
    $ ls -l testfile
    -rwx------. 1 lars lars 0 Nov 20 07:50 testfile
    

    阅读更多here

    【讨论】:

    • 请注意Python includes os.umask 用于操作umask
    • 当然,尽管我认为在大多数情况下,您希望让用户在您的代码外部操作他们的 umask。如果有人明确设置了他们的 umask 以避免创建世界可读的文档,那么当有人在背后做出改变时,这可能会令人惊讶。
    • 有趣!但是,如果您不想使用 set umask 打开所有文件并使用无需许可的特定文件创建功能怎么办?
    • 当然,您可以将umask 设置为0,或者在您的代码外部,或者按照@ShadowRanger 的建议,使用os.umask
    • @larsks:同意通常用户应该负责他们的umask,而不是程序。
    猜你喜欢
    • 2012-03-11
    • 2016-10-25
    • 1970-01-01
    • 2018-05-28
    • 2011-04-16
    • 2018-09-15
    • 1970-01-01
    • 2013-10-30
    • 2021-01-17
    相关资源
    最近更新 更多