Elixir/Erlang:在 open/write/mkdir 时设置权限?

Elixir/Erlang: Set permissions at time of open/write/mkdir?

我正在从我的 Elixir/Erlang 服务中编写一些配置文件和目录结构,并且想要对目录和文件(rwxr-x---(750) 和 rw-r- ----分别为(640))。基本上,我不希望任何“其他”可访问性)。

出于一致性和性能方面的原因,我宁愿不写!/3 每次都紧接着 chmod/2。我想也许我需要执行 open/2 才能获得这种灵活性。但是,尽管模块中记录了权限掩码,但它们似乎仅由 chmod/2 使用。我查看了 Erlang :file 模块以查看这是否是其中之一(改用 Erlang 模块),但没有在那里找到它。

我已经尝试过 umask,当我通过命令行混合 运行 它时,它工作正常,但当通过埋在 systemd 服务中的构建产品部署时,它不起作用。在那里我试图同时设置 UMask=0027 或通过环境,但它似乎在那里被忽略了。我真的宁愿在创建时进行显式设置,也不愿在其他地方使用 umask 操作来获得效果。

在 Linux 中,文件权限是在创建时使用 openO_CREAT 或使用 chmod 系统调用设置的。

在 Erlang 中,您有 file:write_file_info to change the permissions, but when using the equivalent to O_CREAT (file:open),没有很大的灵活性。

我快速搜索了存储库中的标志,我认为 O_CREATE 模式是固定的,你可以看到行 here,这里固定为

#ifdef NO_UMASK
#define FILE_MODE 0644
#define DIR_MODE  0755
#else
#define FILE_MODE 0666
#define DIR_MODE  0777
#endif

但是,创建文件时会应用 umask。

话虽这么说,如果文件打开太多以至于权限检查出现问题,也许值得将其保持打开状态(因此只需要一个 chmod) 或者你可以手动设置config的顶层目录的权限,如果other无法read/traverse顶层目录,即使更深的文件可以读取也没有关系。