【发布时间】:2020-06-09 17:37:17
【问题描述】:
我需要使用 Go 来获取给定文件的文件权限(特别是 SUID 位)。以下是示例文件的权限。
$ touch example_file.test
$ chmod 7777 example_file.test
$ ls -ltra example_file.test
-rwsrwsrwt 1 luke users 0 Feb 25 21:53 example_file.test
$ stat -c "%a %n" example_file.test
7777 example_file.test
这是一个说明问题的小程序。
func main() {
info, _ := os.Stat("example_file.test")
fmt.Println(info.Mode().String()) // ugtrwxrwxrwx
fmt.Println(info.Mode().Perm().String()) // -rwxrwxrwx
fmt.Printf("permissions: %#o\n", info.Mode().Perm()) // permissions: 0777
}
Go 结果不一致,因为ugtrwxrwxrwx != 0777。
文档中的以下引用表明这可能是一个跨平台兼容性问题。
FileMode 表示文件的模式和权限位。位有 所有系统上的定义相同,因此有关文件的信息 可以便携式地从一个系统移动到另一个系统。并非所有位都适用 到所有系统。唯一需要的位是目录的 ModeDir。
type FileMode uint32 定义的文件模式位最多 FileMode 的重要位。九个最低有效位是 标准的 Unix rwxrwxrwx 权限。这些位的值 应该被认为是公共 API 的一部分,并且可以在线路中使用 协议或磁盘表示:它们不得更改,尽管 可能会添加新的位。
这是 Go 的限制吗?
【问题讨论】:
-
我不确定您所说的 inconsistent 是什么意思。模式的
Perm部分定义为低九位。去掉除了ugtrwxrwxrwx的低九位之外的所有内容,你就剩下rwxrwxrwx,这正是你所看到的。如果您想要比低九位更多的位,请不要剥离其他位。
标签: go unix file-permissions