是否有查找完整文件权限的功能?

我需要使用 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 的限制吗?


慕哥6287543
浏览 140回答 2
2回答

慕姐4208626

值得注意的是,除了八进制表示不匹配之外,字符串表示也不匹配:"-rwsrwsrwt" != "ugtrwxrwxrwx"`这不是由于 Go 实现的限制,而是它以与系统无关的方式实现的结果。从文档(强调我的):FileModeFileMode 表示文件的模式和权限位。这些位在所有系统上都具有相同的定义,因此可以将有关文件的信息从一个系统移动到另一个系统。并非所有位都适用于所有系统。因为实现并不是为了模仿特定系统的行为,所以不能保证输出与给定环境中的本机工具相匹配。但是,所有相关数据都可以使用。如果你想模仿你的输出,stat你可以编写一些逻辑来做到这一点。这是一个处理八进制表示的快速示例:package mainimport (    "fmt"    "os")func UnixPerm(m os.FileMode) (p uint32) {    p = uint32(m.Perm())    if m & os.ModeSetuid != 0 {        p |= 04000    }    if m & os.ModeSetgid != 0 {        p |= 02000    }    if m & os.ModeSticky != 0 {        p |= 01000    }    return p}func main() {    info, _ := os.Stat("example_file")    fmt.Printf("FileMode.Perm(): %04o\n", info.Mode().Perm())    fmt.Printf("UnixPerm(): %04o\n", UnixPerm(info.Mode()))}输出:$ go run fileperm.goFileMode.Perm(): 0777UnixPerm(): 7777$ stat --printf "Permissions: %a\n" example_filePermissions: 7777

函数式编程

我需要使用 golang 来获取给定文件的文件权限(特别是 SUID 位)好的,添加这个:fmt.Printf("File has SUID bit set: %t\n", info.Mode()&os.ModeSetuid != 0)golang 结果不一致,因为 ugtrwxrwxrwx != 0777info.Mode()和info.Mode().Perm()是不同的东西,虽然相关。info.Mode().Perm()包含 的子集info.Mode()。info.Mode().Perm()只是一个简单的便利功能,可以使用常量 mask 进行按位与0777。这是go的限制吗?不
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go