Linux os.MkDir和os.MkDirAll权限值?

Linux os.MkDir和os.MkDirAll权限值?,linux,go,Linux,Go,我试图在程序开始时创建一个日志文件 我需要检查“/log”目录是否存在,如果它没有创建该目录,则继续创建日志文件 我尝试使用os.Mkdir(以及os.MkDirAll),但是无论我在第二个参数中输入什么值,我都会得到一个没有权限的锁定文件夹。要获取用户文件夹的读/写操作,该值应该是多少?我以为是0x700,但似乎不起作用 谢谢 @Daniel在回答中的陈述并不完全正确,而且正如@SashaCrofter在他的评论中正确指出的那样,它谈到了十进制数,然后使用了八进制数 实际上,权限值的形式并不重

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

我需要检查“/log”目录是否存在,如果它没有创建该目录,则继续创建日志文件

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


谢谢

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

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

由于POSIX文件系统上的权限位是三位的——三位用于所有者、组和其他人的访问,加上三位修饰符(如粘性位),所以习惯上使用八进制数来表示权限,因为八进制数中的每个数字代表三位值

因此,当您在Go代码中使用0700时,前导的0被剥离,并且只在那里告诉解析器它看到了一个八进制数文本,以下三个字母按此顺序代表所有者、组和其他人权限。比如说,如果您还想设置组粘性位以及使文件系统对象组可读和可执行,那么您需要指定02750,以此类推

请注意,文件系统对象获得的实际权限由创建该对象的进程的活动
umask
进一步调整


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

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

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 |
+------------+------+-------+



常用权限用法

+-----+---+--------------------------+
| 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 |
+------------+------+-------+
0755常用于web服务器。所有者可以读、写、执行。其他人可以读取和执行文件,但不能修改文件

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

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

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


Linux上的目录权限

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

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



权限计算器


方便。

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

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

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

类似地,如果您使用
0777
调用
os.Mkdir
os.MkdirAll
,umask将删除不需要的权限,留给您正确的权限

但我提到有例外。这些程序包括仅为用户复制敏感信息的程序:对于目录,这些程序通常应使用模式
0700
,对于文件,这些程序应使用模式
0600
。它们可能包括作为系统用户而不是任何个人的长期运行的服务器。。。虽然这些服务器可以使用正确的umask运行,但在这种情况下,
0777
0666
就可以了

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


(请注意,umask不适用于
os.Chmod
调用。这里您可以直接选择模式。)

您可以将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

确保您正在设置所需的权限类型的一种方法是使用package
os
中非常方便的
FileMode
常量,而无需计算复杂的八进制:

我通常使用
os.ModePerm
(实际上编码为