更新:根据到目前为止的评论和回复,我想我应该明确表示我理解 0700 是十进制数 448 的八进制表示形式。我在这里关心的是,当八进制模式参数或十进制数被重铸为八进制并传递给 os.FileMode 方法,使用 WriteFile 创建的文件的最终权限似乎没有以有意义的方式排列。
\n\n我尽了最大努力将问题的规模缩小到其本质,也许我需要再进行一轮
\n\nUpdate2:重新阅读后,我想我可以更简洁地陈述我的问题。调用 os.FileMode(700) 应该与使用二进制值 1-010-111-100 调用它相同。对于这 9 个最低有效位,应该有以下权限:
\n\n--w-rwxr--或八进制的 274(并翻译回
相反,该 FileMode 会导致 WriteFile 使用以下命令创建文件:
\n\n--w-r-xr--八进制表示为 254。
当使用用 go 编写的内部实用程序时,使用 ioutil.WriteFile() 创建文件时使用十进制 700 而不是八进制 0700 导致文件创建权限错误。即:\n ioutil.WriteFile("decimal.txt", "filecontents", 700) <- wrong!\nioutil.WriteFile("octal.txt", "filecontents", 0700) <- correct!
当使用十进制数(即没有前导零将其标识为 go_lang 的八进制数)时,应该具有权限的文件\n0700 -> \'-rwx------\'具有0254 -> \'--w-r-xr--\'
修复后,我注意到当我将 700 十进制转换为八进制时,我得到的是 \xe2\x80\x9c1274\xe2\x80\x9d 而不是“0254”的实验结果。
\n\n当我将 700 十进制转换为二进制时,我得到:(1-010-111-100我在 rwx\xe2\x80\x99 分隔处添加了破折号)。除了设置的前导位之外,这看起来像是“0274”的权限。
我查看了FileMode 的 go 文档,发现 FileMode 的底层是一个 uint32。九个最小位映射到标准 unix 文件 perm 结构。前 12 位表示特殊文件功能。我认为第十位中的一位领先位处于未使用的领域。
\n\n我仍然很困惑,所以我尝试:
\n\n\n\npackage main\nimport (\n "io/ioutil"\n "fmt"\n "os"\n)\n\nfunc main() {\n content := []byte("temporary file\'s content")\n modes := map[string]os.FileMode{\n "700": os.FileMode(700),\n "0700": os.FileMode(0700),\n "1274": os.FileMode(1274),\n "01274": os.FileMode(01274)}\n for name, mode := range modes {\n if err := ioutil.WriteFile(name, content, mode); err != nil {\n fmt.Println("error creating ", name, " as ", mode)\n }\n if fi, err := os.Lstat(name); err == nil {\n mode := fi.Mode()\n fmt.Println("file\\t", name, "\\thas ", mode.String())\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n而现在我更加困惑了。我得到的结果是:
\n\nfile 700 has --w-r-xr--\nfile 0700 has -rwx------\nfile 1274 has --wxr-x---\nfile 01274 has --w-r-xr--\nRun Code Online (Sandbox Code Playgroud)\n\n并通过查看文件系统得到确认:
\n\n--w-r-xr-- 1 rfagen staff 24 Jan 5 17:43 700\n-rwx------ 1 rfagen staff 24 Jan 5 17:43 0700\n--wxr-x--- 1 rfagen staff 24 Jan 5 17:43 1274\n--w-r-xr-- 1 rfagen staff 24 Jan 5 17:43 01274\nRun Code Online (Sandbox Code Playgroud)\n\n我模糊地怀疑大于 2^9 的数字的额外部分在某种程度上弄乱了它,但我无法弄清楚,即使在查看了FileMode 的源代码之后也是如此。据我所知,它只查看 12 MSB 和 9 LSB。
\n