os.MkDir和os.MkDirAll权限值?

Scr*_*ile 50 go

我正在尝试在程序开始时创建一个日志文件.

我需要检查是否存在"/ log"目录,如果它不创建目录,则继续创建日志文件.

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

谢谢!

Sha*_*ews 93

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

os.Mkdir("dirname", 0700)
Run Code Online (Sandbox Code Playgroud)


许可比特

+-----+---+--------------------------+
| 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 |
+------------+------+-------+
Run Code Online (Sandbox Code Playgroud)

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

权限计算器

权限计算器

一个方便的权限计算器.

  • 我不明白你如何理解unix权限,给出了解释,但仍然说"在某些情况下,你需要设置777权限才能将任何文件上传到服务器(例如,在WordPress中上传图片)"不!除非极少数情况下(例如`/ tmp`,但是设置了`sticky`位,所以它不一样),你永远不需要in.如果需要上传内容,请将目录用户设置为运行Web服务器或PHP的用户.这就够了.无需随机用户或MTA或任何能够写入此目录的内容 (7认同)
  • 这个答案对权限值前面额外的“0”的要求视而不见。有人可以谈谈并将其添加到答案中吗? (2认同)
  • 还值得注意的是,目录需要 *execute* 权限。这是一个奇怪的 Unix 事情。 (2认同)
  • @Timmmm 目录需要执行权限,以便您可以 _cd_ 进入它。 (2认同)

kos*_*tix 22

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

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

由于POSIX文件系统上的权限位是三位的 - 所有者,组和其他访问的三位,加上三位修饰符(例如粘滞位), - 习惯上使用八进制数来表示权限,因为每个数字都在八进制数表示三位值.

因此,当你在Go代码中使用0700时,前导0被剥离并且仅在那里告诉解析器它看到八进制数字文字,并且以下三个字母代表所有者,组和其他权限,按此顺序.例如,如果您想要设置组粘滞位以及使文件系统对象组可读和可执行,那么您可以指定02750等等.

请注意,文件系统对象获取的实际权限进一步由umask创建对象的进程的活动进行调制.

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


Jos*_*ush 12

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

syscall.Umask(0)
Run Code Online (Sandbox Code Playgroud)

例子

_ = os.MkdirAll("/tmp/dirs/1", 0664)
syscall.Umask(0)
_ = os.MkdirAll("/tmp/dirs/2", 0664)
Run Code Online (Sandbox Code Playgroud)

结果

/tmp/dirs$ stat -c '%A %a %n' *
drw-r--r-- 644 1
drw-rw-r-- 664 2
Run Code Online (Sandbox Code Playgroud)

  • 这才是真正的答案 (2认同)

tor*_*rek 6

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

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

如果用户希望将可写性扩展到他们的组,他们只需要将他们的 umask 设置为2:现在他们剥夺了其他人的写权限,但将其留给他们的组。现在使用 mode 创建新文件rw-rw-r--。该计划并没有改变:它仍然使用0666它的方式。但是文件是用 mode 创建的0664

同样,如果你打电话os.Mkdiros.MkdirAll使用0777上,umask会带走不需要的权限,让你用正确的权限。

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

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

(请注意,umask的不适os.Chmod调用。在这里,你直接选择模式。)


Gwy*_*lyn 5

确保设置所需权限类型而无需计算八进制的复杂计算的一种方法是使用FileModepackage 中非常方便的常量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 ...
}
Run Code Online (Sandbox Code Playgroud)

去游乐场

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