【问题标题】:Fail to write file with permission 0777 [closed]无法使用权​​限 0777 写入文件 [关闭]
【发布时间】:2020-03-14 04:07:46
【问题描述】:

我正在使用权限 0777 将文件写入 unix 上的磁盘,但 ls -la 显示它具有 -rwxr-xr-x,这不是预期的。

 err = ioutil.WriteFile(path, jsonByte, 0777)
    if err != nil {
        log.Print(err)
    }

我希望得到-rwxrwxrwx 的许可。我不明白为什么缺少w 权限。

【问题讨论】:

  • 如果文件已经存在,WriteFile 不会改变权限。

标签: go


【解决方案1】:

首先,作为Burak Serdar notes in a comment,请确保这确实是一个文件,因为操作系统通常会在覆盖现有文件时保留现有权限(尽管细节是操作系统-具体的,特别是some Unix-ish OSes clear setuid/setgid here)。

Unix/Linux 文件权限通过让操作系统清除程序的权限中删除用户请求的任何权限来工作请求被批准。

也就是说,当调用创建新文件的文件系统操作时,您在代码中提供了一种模式。在这种情况下,您提供的是 0777,这确实是 rwxrwxrwx

然而,用户的操作环境1包含另一个八进制模式,称为umask。在这种情况下,它大概是022----w--w-。这些权限已从您提供的权限中删除0777 & (^022)0755,即 rwxr-xr-x。所以新创建的文件的模式是rwxr-xr-x,或者0755,即使你的程序要求0777

因此,大多数 Unix 程序在文件创建操作期间应使用以下两种模式之一:0777 用于目录和可执行文件,0666 用于非可执行文件。用户的 umask 将删除不需要的权限:想要隐私的用户可以将他们的 umask 设置为 077,这将删除组和其他的 rwx,只留下 07000600 视情况而定。

此规则的一个例外是,任何想要确保额外隐私的程序(例如与ssh 相关的代码,在创建密钥对时)都应提供其模式为0600这样一开始就没有设置组和其他用户权限位。

请注意,chmod 调用应用了用户的 umask 设置。如果您需要发现用户的 umask 来计算 chmod 调用的正确值,请使用新的 golang.org/sys/x/unix Umask 函数或旧的 syscall Umask 函数。不幸的是,您必须提供 new umask 才能发现 original umask。这会替换每个进程的 umask,直到您重新安装原始值。因此,您可能希望在 init 函数中执行此操作,并将结果存储在变量中以便妥善保管,同时还可以恢复原始结果:

var Umask int

func init() {
    Umask = unix.Umask(0777)
    unix.Umask(Umask)
}

例如(假设新样式;旧样式syscall.Umask 用法相同;都没有返回任何错误)。不过,这会使您的程序特定于 Unix。


1这意味着存储在内核的每个进程数据中的权限,而不是 shell 样式的环境变量。

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多