os.Mkdir 和 os.MkdirAll 权限

2024-10-31 08:38:00
admin
原创
43
摘要:问题描述:我正在尝试在程序启动时创建一个日志文件。我需要检查/log目录是否存在,如果不存在则继续创建日志文件。好吧,我尝试使用os.Mkdir(以及os.MkdirAll),但无论我在第二个参数中输入什么值,我都会得到一个没有权限的锁定文件夹。为了获得对用户文件夹的读/写权限,这个值应该是多少?我以为是,0...

问题描述:

我正在尝试在程序启动时创建一个日志文件。

我需要检查/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提及的是,这些权限是根据所设置的内容进行“过滤”的。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用