86

我试图在我的程序开始时创建一个日志文件。

/log如果没有创建目录,我需要检查目录是否存在,然后继续创建日志文件。

好吧,我尝试使用os.Mkdir(以及os.MkdirAll),但是无论我在第二个参数中输入什么值,我都会得到一个没有权限的锁定文件夹。为了获得用户文件夹的读/写,这应该是什么值?我以为会,0x700但它似乎不起作用。

谢谢!

4

5 回答 5

147

您可以直接使用八进制表示法:

os.Mkdir("dirname", 0700)


权限位

+-----+---+--------------------------+
| rwx | 7 | Read, write and execute  |
| rw- | 6 | Read, write              |
| r-x | 5 | Read, and execute        |
| r-- | 4 | Read,                    |
| -wx | 3 | Write and execute        |
| -w- | 2 | Write                    |
| --x | 1 | Execute                  |
| --- | 0 | no permissions           |
+------------------------------------+

+------------+------+-------+
| Permission | Octal| Field |
+------------+------+-------+
| rwx------  | 0700 | User  |
| ---rwx---  | 0070 | Group |
| ------rwx  | 0007 | Other |
+------------+------+-------+

Unix 权限入门


常见权限用法

0755常用于 Web 服务器。所有者可以读、写、执行。其他人都可以读取和执行但不能修改文件。

0777每个人都可以读写和执行。在 Web 服务器上,不建议对您的文件和文件夹使用“777”权限,因为它允许任何人向您的服务器添加恶意代码。

0644只有所有者可以读写。其他人只能阅读。没有人可以执行该文件。

0655只有所有者可以读写文件,但不能执行文件。其他人都可以读取和执行,但不能修改文件。

www.maketecheasier.com/file-permissions-what-does-chmod-777-means/


Linux 上的目录权限

在 Linux 上对目录应用权限时,权限位的含义与常规文件不同。(来源

读取位用户可以读取目录中包含的文件名。
写入位如果还设置了执行位,用户可以{添加、重命名、删除}文件名。
执行位用户可以进入目录并访问里面的文件。

https://unix.stackexchange.com/a/21252

权限计算器

权限计算器

一个方便的权限计算器

于 2015-07-01T02:11:04.487 回答
25

@Daniel 在他的回答中的陈述并不真正正确,而且它谈到了一个十进制数,然后使用一个八进制数,正如@SashaCrofter 在他的评论中正确指出的那样。

实际上,只要它代表合理的 Unix 权限,您的权限值的形式并不重要。

由于 POSIX 文件系统上的权限位以三位的形式出现——三位用于所有者、组和其他访问,加上三位修饰符(例如粘性位)——习惯上使用八进制数将权限表示为每个数字八进制数表示一个三位值。

因此,当你在 Go 代码中使用 0700 时,前导 0 被去除,仅用于告诉解析器它看到一个八进制数字文字,以下三个字母依次代表所有者、组和其他权限。如果您还想设置组粘性位以及使文件系统对象组可读和可执行,您可以指定 02750 等等。

请注意,文件系统对象获得的实际权限进一步受到umask创建该对象的进程的活跃度的调节。

为了更好地掌握这些主题,最好阅读chmod有关类 Unix 操作系统的手册页和一般文献。

于 2013-02-17T13:51:14.910 回答
14

您可以将 umask 重置为 0。我将其称为主文件中的第一件事

syscall.Umask(0)

例子

_ = os.MkdirAll("/tmp/dirs/1", 0664)
syscall.Umask(0)
_ = os.MkdirAll("/tmp/dirs/2", 0664)

结果

/tmp/dirs$ stat -c '%A %a %n' *
drw-r--r-- 644 1
drw-rw-r-- 664 2
于 2020-05-06T21:19:40.613 回答
7

除了其他答案,请记住,在 Unix 和 Linux 风格的操作系统上,所有程序都使用umask设置运行。umask 在许多情况下默认为 022 或有时为 002,是系统将从文件和目录创建请求中自动删除的权限集。

这意味着大多数程序——这个规则有几个例外——应该使用模式0666来创建文件和模式0777来创建目录。用户的配置,记录在运行过程中,说明要拿走这些权限中的哪一个。如果用户的设置是022,我们创建一个文件 mode 0666,我们得到的实际设置是rw-r--r--:用户读写,组只读,其他人只读。

如果用户希望将可写性扩展到他们的组,他们只需将他们的 umask 设置为2:现在他们取消其他人的写入权限,但将其留给他们的组。现在使用 mode 创建新文件rw-rw-r--程序没有改变:它仍然使用它的0666模式。但是文件是用 mode 创建的0664

同样,如果您调用os.Mkdiror os.MkdirAll0777则 umask 将带走不需要的权限,让您拥有正确的权限。

但我提到有例外。其中包括复制敏感信息的程序,这些信息仅供用户使用:这些程序通常应0700为目录和0600文件使用模式。它们可能包括充当系统用户而不是任何个人的长期运行的服务器......尽管这些服务器可以使用正确的 umask 运行,在这种情况下,0777或者0666很好。

你必须在这里应用一些判断。具有特别安全意识的程序,例如 ssh 或类似程序,可能希望使用有限的权限,甚至可能希望检查(使用os.Lstat或类似的)权限对重要目录是否适当严格。

(注意umask不适用于os.Chmod通话,这里直接选择模式。)

于 2020-01-29T08:31:18.150 回答
2

确保您设置所需权限的一种方法是使用非常方便的FileMode常量,而不用八进制计算复杂的计算os

https://golang.org/pkg/os/#FileMode

我通常将os.ModePerm(实际上编码为0777)用于完全许可的目录,例如缓存或临时文件所需的目录,但您的里程可能会有所不同。要设置附加位(粘性等),正如@kostix 所指出的那样,必须处理 Go 中标志的八进制表示问题,您总是可以使用类似的东西:

if err := os.MkdirAll("my/tmp/dir", os.ModeSticky|os.ModePerm); err != nil {
  ... handle error ...
}

去游乐场

与往常一样,再次值得一提的是,这些权限umask被设置的任何内容“过滤”。

于 2020-09-08T23:07:36.013 回答