我需要使用golang来获取给定文件(特别是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
}
Golang结果不一致,因为ugtrwxrwxrwx != 0777
。
文档中的以下引号表示这可能是跨平台兼容性问题。
FileMode代表文件的模式和权限位。这些位有所有系统上的定义相同,因此有关文件的信息可以从一个系统移动到另一个系统。并非所有位都适用所有系统。唯一需要的位是目录的ModeDir。
type FileMode uint32类型,定义的文件模式位是最FileMode的有效位。九个最低有效位是标准的Unix rwxrwxrwx权限。这些位的值应该被视为公共API的一部分,并且可以在有线中使用协议或磁盘表示形式:尽管它们不能更改可能会添加新的位。
这是限制吗?
我需要使用golang来获取给定文件的文件许可权(特别是SUID位)
确定,添加此:fmt.Printf("File has SUID bit set: %t\n", info.Mode()&os.ModeSetuid != 0)
golang结果不一致,因为ugtrwxrwxrwx!= 0777
info.Mode()
和info.Mode().Perm()
是不同的,尽管相关。
info.Mode().Perm()
包含info.Mode()
的子集。 info.Mode().Perm()
只是一个简单的便利功能,可以使用恒定掩码0777
按位进行。
这是限制吗?
否