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