【问题标题】:Setting os.Mkdir permissions设置 os.Mkdir 权限
【发布时间】:2017-01-10 09:18:30
【问题描述】:

我正在尝试使用 os.Mkdir 创建具有特定权限的目录,但由于某种原因我无法使其工作。

我的测试程序是:

package main

import (
        "log"
        "os"
)

func main() {                 
    err := os.Mkdir("testdir", 0775)
    if err != nil {              
        log.Print(err)
    }
}

但是,创建的目录默认有0755权限:

drwxr-xr-x 2 user user 4096 Jan 10 10:14 testdir

来自 shell 的 chmod 工作正常,所以我不确定 Go 程序为什么不工作。

【问题讨论】:

  • 运行umask 命令时会出现什么?
  • 0022 就是它所说的
  • with umask 0022 在创建文件后添加权限os.Chmod("testdir", 0777) 对我有用,但我不确定它是否是好的解决方案。
  • 是的,这是关于与当前进程的umask 值的交互,因此通常与 Go 或 StackOverflow 无关。请阅读一本关于在 Unix 环境中工作的入门书籍。

标签: go


【解决方案1】:

在创建文件时,类 Unix 系统使用权限掩码 (umask) 来创建默认权限。

如果umask 的值为0022,则将创建最多具有0755 权限的新目录。新文件的权限最多为0644

如果你想创建一个具有0775权限的新目录,那么你必须将你的umask值设置为0002

解决此问题的另一种方法是在创建文件后修改权限:使用os.Mkdir 使用默认权限创建它,然后使用os.Chmod 修改这些权限。

【讨论】:

  • 感谢您的回复,但是在我的 Go 程序中,我指定我想要创建文件的 0775 权限,但它不起作用。也许它不起作用,我必须稍后更改它,但有这个非功能选项似乎很尴尬。
  • os.Mkdir 无法创建权限大于掩码的文件,但os.Chmod 可以?
  • @siritinga 这正是您的问题:操作系统阻止您创建权限为 0775 的目录。我刚刚尝试在我的笔记本电脑上将 umask 从 0022 修改为 0002(运行 umask 0002),我保证你它有效。这是 Unix 的问题,不是 Go 的错。
  • @Iwan os.Chmod 修改现有文件的权限,os.Mkdir 创建一个新文件。 umask 仅适用于创建操作(希望如此),这就是创建后 chmoding 起作用的原因。
  • @siritinga:Go 正在按照它在这里所说的那样做,并且正在请求使用您设置的权限创建文件。您的操作系统正在使用 Go 无法控制的 umask 来“屏蔽”权限。这就是 POSIX 系统的工作方式,如果不了解您正在使用的底层系统,您将无法长久。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 2015-07-05
  • 2018-12-06
  • 2017-07-12
  • 1970-01-01
  • 2015-08-01
  • 2017-10-23
相关资源
最近更新 更多