go - ioutils.WriteFile() 不尊重权限

标签 go file-permissions

我正在尝试使用 ioutils.WriteFile() 但由于某种原因它忽略了我给它的 0777 权限。

package main

import (
    "io/ioutil"
    "os"
)

func main() {

    // normal permissions
    if err := ioutil.WriteFile("cant-touch-this-0644", []byte{}, 0644); err != nil {
            panic(err)
    }


    // full permissions
    if err := ioutil.WriteFile("cant-touch-this-0777", []byte{}, 0777); err != nil {
            panic(err)
    }


    // normal permissions + chmod to full
    if err := ioutil.WriteFile("cant-touch-this-mixed", []byte{}, 0755); err != nil {
            panic(err)
    }

    if err := os.Chmod("cant-touch-this-mixed", 0777); err != nil {
            panic(err)
    }
}

我从这里得到的输出是:

$ ls -l
-rw-r--r--  1 edson edson    0 May  9 17:19  cant-touch-this-0644
-rwxr-xr-x  1 edson edson    0 May  9 17:19  cant-touch-this-0777
-rwxrwxrwx  1 edson edson    0 May  9 17:19  cant-touch-this-mixed

这意味着:

  • 第一个场景 (0644) 成功了
  • 第二个 (0777) 被忽略了
  • 获得完整 0777 权限的唯一方法是使用 os.Chmod(如第三种情况)

我做错了什么?

最佳答案

正如这个问题的评论所说,这是因为 umask工作了。 unmask 控制如何为新创建的文件设置文件权限。当 umask 为 022 时,您要创建的文件为 666 将是 644(从组和其他权限中删除写权限)。您可以使用 umask 命令检查目录的 umask。

关于go - ioutils.WriteFile() 不尊重权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50257981/

相关文章:

struct - 如何在 Go 中从结构体创建 []string

templates - 在 Go 服务器 : download fail 上加载 Angular2 Bootstrap 模板 ng2-admin

file - 检查文件是否为硬链接(hard link)

go - 如何在 Go 中创建透明 gif?

go - conn.SetDeadline() 是否在超时时关闭连接

file-permissions - 在 Sublime Text 2 中更改文件和文件夹权限

linux - Laravel 无法使用权​​限 775 写入/存储 - Amazon AWS Linux

Git:跟踪权限更改 777 到 444

java - 如何检查 PDF 是否受密码保护

linux - 为什么 do_execve() 会分两步而不是一步执行可执行验证检查?