我试图在程序开始时创建日志文件。我需要检查/log目录是否存在,如果它没有创建目录,则继续创建日志文件。我尝试使用os.Mkdir(以及os.MkdirAll),但无论我在第二个参数中输入什么值,我都会得到一个没有权限的锁定文件夹。为了获得对用户文件夹的读/写,该值应该是什么?我以为它会是0x700,但它似乎不工作。谢谢你,谢谢
/log
os.Mkdir
os.MkdirAll
0x700
kxxlusnw1#
您可以直接使用octal notation:
os.Mkdir("dirname", 0700)
权限位
权限位过去是以八进制给出的,因此文字值必须以0为前缀。否则,它将被解释为十进制,并给予混乱的结果。这与Linux命令chmod一致。
0
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 | +------------+------+-------+
A Unix Permission Primer
常用权限用法0755通常用于Web服务器。所有者可以读,写,执行。其他任何人都可以读取和执行文件,但不能修改文件。0777每个人都可以读写和执行。在Web服务器上,不建议对文件和文件夹使用“777”权限,因为它允许任何人向您的服务器添加恶意代码。0644只有所有者可以读写。其他人只能阅读。没有人可以执行该文件。0655只有文件所有者可以读写,但不能执行。其他人可以读取和执行文件,但不能修改文件。
www.maketecheasier.com/file-permissions-what-does-chmod-777-means/
Linux上的目录服务器
在Linux上对目录应用权限时,权限位的含义与常规文件不同。(source)
读取位用户可以读取目录中包含的文件名。写入位如果执行位也被设置,用户可以{添加,重命名,删除}文件名。执行位用户可以进入目录,访问其中的文件。
https://unix.stackexchange.com/a/21252
权限计算器
一个方便的permissions calculator。
5f0d552i2#
@丹尼尔在他的回答中的陈述并不真正正确,而且它谈论了一个十进制数,然后使用了一个八进制数,正如@SashaCrofter在他的评论中正确指出的那样。实际上,权限值采用什么形式并不重要,只要它表示合理的Unix权限即可。由于POSIX文件系统上的权限位是三位的-三位用于所有者,组和其他人访问,加上三位修饰符(如粘性位)-习惯上使用八进制数字来表示权限,因为八进制数字中的每个 digit 表示三位值。因此,当你在Go代码中使用0700时,前导0被剥离,只是告诉解析器它看到的是一个八进制数字,下面的三个字母代表所有者,组和其他人的权限,按照这个顺序。如果您还想设置组粘性位,并使文件系统对象组可读和可执行,则可以指定02750,依此类推。请注意,文件系统对象获得的实际权限由创建对象的进程的活动umask进一步调制。要更好地掌握这些主题,最好阅读chmod手册页和类Unix操作系统的一般文献。
umask
hlswsv353#
您可以将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
tyky79it4#
除了其他答案,请记住,在Unix和Linux风格的操作系统上,所有程序都使用 umask 设置运行。umask,在许多情况下默认为022,有时为002,是系统将从文件和目录创建请求中自动删除的权限集。这意味着大多数程序(有几个例外)应该使用模式0666创建文件,使用模式0777创建目录。记录在正在运行的进程中的 user's configuration 表示要 * 拿走 * 这些权限中的哪些。如果用户的设置是022,我们创建一个模式为0666的文件,我们得到的实际设置是rw-r--r--:对用户为读写,对组为只读,对其他用户为只读。如果用户希望将可写性扩展到他们的组,他们只需要将umask设置为2:现在他们拿走了其他人的写权限,但把它留给了他们的小组。新文件现在以rw-rw-r--模式创建。* 程序 * 不会更改:它仍然使用0666作为其模式。但是 files 是用0664模式创建的。类似地,如果您使用0777调用os.Mkdir或os.MkdirAll,则umask将删除不需要的权限,只留下正确的权限。但我提到过也有例外。其中包括复制仅针对用户的敏感信息的程序:这些通常应该对目录使用0700模式,对文件使用0600模式。它们 * 可能 * 包括长期运行的服务器,作为系统用户而不是任何一个人。尽管这些服务器可以使用正确的umask运行,在这种情况下,0777或0666就可以了。你必须在这里做出一些判断。特别注重安全性的程序,比如ssh或类似程序,可能希望使用有限的权限,甚至可能希望检查(使用os.Lstat或类似程序)重要目录的权限是否适当严格。(Note umask * 不适用于 * os.Chmod调用。这里 * 您 * 直接选择模式。)
0666
0777
022
rw-r--r--
2
rw-rw-r--
0664
0700
0600
os.Lstat
os.Chmod
h7appiyu5#
一种确保设置所需权限类型的方法是使用os包中非常方便的FileMode常量,而无需计算复杂的八进制计算:https://golang.org/pkg/os/#FileMode我通常使用os.ModePerm(实际上编码为0777)来处理完全许可的目录,例如缓存或临时文件所需的目录,但您可能会有所不同。要设置额外的位(sticky等),正如@kostix所指出的,必须处理Go中标志的八进制表示问题,您可以始终使用以下内容:
os
FileMode
os.ModePerm
if err := os.MkdirAll("my/tmp/dir", os.ModeSticky|os.ModePerm); err != nil { ... handle error ... }
Go playground和往常一样,值得再次提及的是,这些权限是由umask设置的“过滤”的。
5条答案
按热度按时间kxxlusnw1#
您可以直接使用octal notation:
权限位
权限位过去是以八进制给出的,因此文字值必须以
0
为前缀。否则,它将被解释为十进制,并给予混乱的结果。这与Linux命令chmod
一致。A Unix Permission Primer
常用权限用法
0755通常用于Web服务器。所有者可以读,写,执行。其他任何人都可以读取和执行文件,但不能修改文件。
0777每个人都可以读写和执行。在Web服务器上,不建议对文件和文件夹使用“777”权限,因为它允许任何人向您的服务器添加恶意代码。
0644只有所有者可以读写。其他人只能阅读。没有人可以执行该文件。
0655只有文件所有者可以读写,但不能执行。其他人可以读取和执行文件,但不能修改文件。
www.maketecheasier.com/file-permissions-what-does-chmod-777-means/
Linux上的目录服务器
在Linux上对目录应用权限时,权限位的含义与常规文件不同。(source)
读取位用户可以读取目录中包含的文件名。
写入位如果执行位也被设置,用户可以{添加,重命名,删除}文件名。
执行位用户可以进入目录,访问其中的文件。
https://unix.stackexchange.com/a/21252
权限计算器
一个方便的permissions calculator。
5f0d552i2#
@丹尼尔在他的回答中的陈述并不真正正确,而且它谈论了一个十进制数,然后使用了一个八进制数,正如@SashaCrofter在他的评论中正确指出的那样。
实际上,权限值采用什么形式并不重要,只要它表示合理的Unix权限即可。
由于POSIX文件系统上的权限位是三位的-三位用于所有者,组和其他人访问,加上三位修饰符(如粘性位)-习惯上使用八进制数字来表示权限,因为八进制数字中的每个 digit 表示三位值。
因此,当你在Go代码中使用0700时,前导0被剥离,只是告诉解析器它看到的是一个八进制数字,下面的三个字母代表所有者,组和其他人的权限,按照这个顺序。如果您还想设置组粘性位,并使文件系统对象组可读和可执行,则可以指定02750,依此类推。
请注意,文件系统对象获得的实际权限由创建对象的进程的活动
umask
进一步调制。要更好地掌握这些主题,最好阅读
chmod
手册页和类Unix操作系统的一般文献。hlswsv353#
您可以将umask重置为0。我会把它作为我的主文件中的第一件事
例如
结果
tyky79it4#
除了其他答案,请记住,在Unix和Linux风格的操作系统上,所有程序都使用 umask 设置运行。umask,在许多情况下默认为022,有时为002,是系统将从文件和目录创建请求中自动删除的权限集。
这意味着大多数程序(有几个例外)应该使用模式
0666
创建文件,使用模式0777
创建目录。记录在正在运行的进程中的 user's configuration 表示要 * 拿走 * 这些权限中的哪些。如果用户的设置是022
,我们创建一个模式为0666
的文件,我们得到的实际设置是rw-r--r--
:对用户为读写,对组为只读,对其他用户为只读。如果用户希望将可写性扩展到他们的组,他们只需要将umask设置为
2
:现在他们拿走了其他人的写权限,但把它留给了他们的小组。新文件现在以rw-rw-r--
模式创建。* 程序 * 不会更改:它仍然使用0666
作为其模式。但是 files 是用0664
模式创建的。类似地,如果您使用
0777
调用os.Mkdir
或os.MkdirAll
,则umask将删除不需要的权限,只留下正确的权限。但我提到过也有例外。其中包括复制仅针对用户的敏感信息的程序:这些通常应该对目录使用
0700
模式,对文件使用0600
模式。它们 * 可能 * 包括长期运行的服务器,作为系统用户而不是任何一个人。尽管这些服务器可以使用正确的umask运行,在这种情况下,0777
或0666
就可以了。你必须在这里做出一些判断。特别注重安全性的程序,比如ssh或类似程序,可能希望使用有限的权限,甚至可能希望检查(使用
os.Lstat
或类似程序)重要目录的权限是否适当严格。(Note umask * 不适用于 *
os.Chmod
调用。这里 * 您 * 直接选择模式。)h7appiyu5#
一种确保设置所需权限类型的方法是使用
os
包中非常方便的FileMode
常量,而无需计算复杂的八进制计算:https://golang.org/pkg/os/#FileMode
我通常使用
os.ModePerm
(实际上编码为0777
)来处理完全许可的目录,例如缓存或临时文件所需的目录,但您可能会有所不同。要设置额外的位(sticky等),正如@kostix所指出的,必须处理Go中标志的八进制表示问题,您可以始终使用以下内容:Go playground
和往常一样,值得再次提及的是,这些权限是由
umask
设置的“过滤”的。