os.Mkdir 和 os.MkdirAll 权限
- 2024-10-31 08:38:00
- admin 原创
- 43
问题描述:
我正在尝试在程序启动时创建一个日志文件。
我需要检查/log
目录是否存在,如果不存在则继续创建日志文件。
好吧,我尝试使用os.Mkdir
(以及os.MkdirAll
),但无论我在第二个参数中输入什么值,我都会得到一个没有权限的锁定文件夹。为了获得对用户文件夹的读/写权限,这个值应该是多少?我以为是,0x700
但似乎不起作用。
谢谢!
解决方案 1:
您可以直接使用八进制表示法:
os.Mkdir("dirname", 0700)
权限位
权限位历来以八进制给出,因此文字值必须以 为前缀0
。否则它将被解释为十进制并给出令人困惑的结果。这与 Linux 命令 一致chmod
。
+-----+---+--------------------------+
| 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
权限计算器
一个方便的权限计算器。
解决方案 2:
@Daniel 在他的回答中的陈述并不正确,而且它讨论的是一个十进制数,然后使用了一个八进制数,正如@SashaCrofter 在他的评论中正确指出的那样。
实际上,只要您的权限值代表合理的 Unix 权限,它的形式并不重要。
由于 POSIX 文件系统上的权限位有三位——三位用于所有者、组和其他人的访问,加上三位修饰符(比如粘性位),——因此通常使用八进制数来表示权限,因为八进制数中的每个数字代表一个三位值。
因此,当您在 Go 代码中使用 0700 时,前导 0 将被剥离,仅用于告诉解析器它看到的是八进制数字文字,后面的三个字母按此顺序代表所有者、组和其他权限。如果您还想设置组粘性位以及使文件系统对象组可读和可执行,则应指定 02750 等。
请注意,文件系统对象获取的实际权限由umask
创建该对象的进程的活动进一步调节。
为了更好地掌握这些主题,最好阅读chmod
类 Unix 操作系统的手册页和一般文献。
解决方案 3:
您可以将 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
解决方案 4:
除了其他答案之外,请记住,在 Unix 和 Linux 风格的操作系统上,所有程序都以umask设置运行。umask 在许多情况下默认为 022,有时为 002,是系统将自动从文件和目录创建请求中删除的一组权限。
这意味着大多数程序(此规则有几个例外)应该使用模式0666
来创建文件,使用模式0777
来创建目录。记录在运行过程中的用户配置说明了要取消哪些权限。如果用户的设置为022
,并且我们创建了一个具有模式的文件0666
,那么我们得到的实际设置为rw-r--r--
:用户可读写,组可只读,其他人可只读。
如果用户希望将可写权限扩展到其所在组,则只需将其 umask 设置为2
:现在他们剥夺了其他人的写权限,但将其留给了其所在组。现在使用 模式创建新文件rw-rw-r--
。程序不会改变:它仍然使用0666
模式。但文件使用 模式创建0664
。
类似地,如果您使用 调用或os.Mkdir
,umask 将带走不需要的权限,为您保留正确的权限。os.MkdirAll
`0777`
但我提到了也有例外。这些包括复制仅供用户使用的敏感信息的程序:这些程序通常应对0700
目录和0600
文件使用模式。它们可能包括以系统用户而非任何个人身份运行的长期服务器……尽管这些服务器可以使用正确的 umask 运行,在这种情况下,0777
或者0666
也可以。
您必须在此运用一些判断力。特别注重安全性的程序(例如 ssh 或类似程序)可能希望使用有限的权限,甚至可能希望检查(使用os.Lstat
或类似程序)重要目录上的权限是否适当严格。
(请注意,umask不适用于os.Chmod
呼叫。在这里您可以直接选择模式。)
解决方案 5:
确保您设置所需权限类型的一种方法是使用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
提及的是,这些权限是根据所设置的内容进行“过滤”的。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件