os.Mkdir 和 os.MkdirAll 权限

2024-10-31 08:38:00
admin
原创
229
摘要:问题描述:我正在尝试在程序启动时创建一个日志文件。我需要检查/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提及的是,这些权限是根据所设置的内容进行“过滤”的。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4062  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2781  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   101  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   118  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   103  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用