我正在尝试在程序开始时创建一个日志文件.
我需要检查是否存在"/ log"目录,如果它不创建目录,则继续创建日志文件.
好吧,我试图使用os.Mkdir(以及os.MkDirAll),但无论我在第二个参数中放入什么值,我都会得到一个没有权限的锁定文件夹.为了获得用户文件夹的读/写,这应该是什么值?我以为它会是0x700,但它似乎不起作用.
谢谢!
Sha*_*ews 93
您可以直接使用八进制表示法:
os.Mkdir("dirname", 0700)
Run Code Online (Sandbox Code Playgroud)
许可比特
+-----+---+--------------------------+
| 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 |
+------------+------+-------+
Run Code Online (Sandbox Code Playgroud)
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
权限计算器
一个方便的权限计算器.
kos*_*tix 22
@ Daniel在他的回答中的陈述并不是真的正确,而且它也谈到一个十进制数,然后使用八进制数,正如@SashaCrofter在他的评论中正确指出的那样.
实际上,只要它表示合理的Unix权限,您的权限值的形式并不重要.
由于POSIX文件系统上的权限位是三位的 - 所有者,组和其他访问的三位,加上三位修饰符(例如粘滞位), - 习惯上使用八进制数来表示权限,因为每个数字都在八进制数表示三位值.
因此,当你在Go代码中使用0700时,前导0被剥离并且仅在那里告诉解析器它看到八进制数字文字,并且以下三个字母代表所有者,组和其他权限,按此顺序.例如,如果您想要设置组粘滞位以及使文件系统对象组可读和可执行,那么您可以指定02750等等.
请注意,文件系统对象获取的实际权限进一步由umask
创建对象的进程的活动进行调制.
为了更好地掌握这些主题,最好阅读chmod
有关类Unix操作系统的手册页和一般文献.
Jos*_*ush 12
您可以将 umask 重置为 0。我将其称为主文件中的第一件事
syscall.Umask(0)
Run Code Online (Sandbox Code Playgroud)
例子
_ = os.MkdirAll("/tmp/dirs/1", 0664)
syscall.Umask(0)
_ = os.MkdirAll("/tmp/dirs/2", 0664)
Run Code Online (Sandbox Code Playgroud)
结果
/tmp/dirs$ stat -c '%A %a %n' *
drw-r--r-- 644 1
drw-rw-r-- 664 2
Run Code Online (Sandbox Code Playgroud)
除了其他答案,请记住,在 Unix 和 Linux 风格的操作系统上,所有程序都使用umask设置运行。umask 在许多情况下默认为 022 或有时为 002,是系统将自动从文件和目录创建请求中删除的一组权限。
这意味着大多数程序——这个规则有几个例外——应该使用模式0666
来创建文件和模式0777
来创建目录。该用户的配置,记录在运行过程中,说要这些权限带走。如果用户的设置是022
,并且我们创建了一个带有 mode 的文件,0666
我们得到的实际设置是rw-r--r--
:用户读写,组只读,其他人只读。
如果用户希望将可写性扩展到他们的组,他们只需要将他们的 umask 设置为2
:现在他们剥夺了其他人的写权限,但将其留给他们的组。现在使用 mode 创建新文件rw-rw-r--
。该计划并没有改变:它仍然使用0666
它的方式。但是文件是用 mode 创建的0664
。
同样,如果你打电话os.Mkdir
或os.MkdirAll
使用0777
上,umask会带走不需要的权限,让你用正确的权限。
但我提到有例外。这些包括制作仅供用户使用的敏感信息副本的程序:这些程序通常应该0700
对目录和0600
文件使用模式。它们可能包括作为系统用户而不是任何个人的长期运行的服务器......尽管这些服务器可以使用正确的 umask 运行,在这种情况下,0777
或者0666
很好。
你必须在这里应用一些判断。具有特别安全意识的程序,例如 ssh 或类似程序,可能希望使用有限的权限,甚至可能希望(使用os.Lstat
或类似方式)检查重要目录的权限是否适当。
(请注意,umask的不适来os.Chmod
调用。在这里,你直接选择模式。)
确保设置所需权限类型而无需计算八进制的复杂计算的一种方法是使用FileMode
package 中非常方便的常量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 ...
}
Run Code Online (Sandbox Code Playgroud)
与往常一样,值得再次提及的是,这些权限是通过umask
已设置的内容“过滤”的。