【问题标题】:Go "permission denied" when trying to create a file in a newly created directory?尝试在新创建的目录中创建文件时出现“权限被拒绝”?
【发布时间】:2020-02-12 15:13:11
【问题描述】:

我正在尝试使用os.Mkdir() 创建一个目录,然后在其中创建文件,类似于此脚本:

package main

import (
    "log"
    "os"
    "path"
)

func main() {
    dir := "test_dir"

    os.Mkdir(dir, os.ModeDir)

    fileName := path.Join(dir, "file.txt")

    _, err := os.Create(fileName)
    if err != nil {
        log.Fatalf("create file: %v", err)
    }
}

但是,如果我运行它,我会得到

> go run fileperms.go
2019/10/15 14:44:02 create file: open test_dir/file.txt: permission denied
exit status 1

我从https://golang.org/pkg/os/#FileMode 不清楚如何指定FileMode 以允许相同的脚本在新创建的目录中创建文件。我怎样才能做到这一点?

【问题讨论】:

  • 几乎所有对os.Mkdir 的调用都应将0777 作为第二个参数传递。你不需要os.ModeDir,因为它是由 make-directory 函数暗示的。低 3 位是 Unix 风格的权限;由操作系统将它们转换为操作系统使用的任何内容。在类 Unix 系统上,当前的 umask 将带走任何不需要的权限,因此您通常应该将所有权限授予所有人以启动。
  • 此规则的例外情况包括,例如,邮件消息处理程序,您可能会假设用户级隐私和使用模式0700:rwx 用于用户,不用于组或其他。一个典型的 umask 是 002022,用来剥夺其他的,也许是组的写权限。

标签: go file-permissions


【解决方案1】:

我发现如果我将权限设置为0777,我可以在目录中创建文件:

package main

import (
    "io/ioutil"
    "os"
    "path"
)

func main() {
    dir := "test_dir"

    os.Mkdir(dir, 0777)

    fileName := path.Join(dir, "file.txt")

    ioutil.WriteFile(fileName, []byte("foobar"), 0666)
}

现在文件已创建,包含预期的内容:

> cat test_dir/file.txt 
foobar⏎ 

【讨论】:

  • 经过数小时的搜索和试错,这个真正解决了我的问题! PS:我使用的是662420666777,但它们都不起作用,尤其是directories
  • 没有必要使用 777,因为它是广泛的权限。它被认为是不安全的。请检查此链接superuser.com/questions/1034079/…
【解决方案2】:

这里,Go 试图在 AUR 包安装期间在 /tmp 目录中创建。

所以我更改了 /tmp 中的权限:

chmod 0777 -R /tmp

但这还不够,所以我不得不更改 /tmp 的所有权(它是 root 的):

sudo chown -R "$USER":wheel /tmp

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 2019-09-27
    • 2017-03-27
    • 2018-02-10
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多