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

Go 是否有查找完整文件权限的功能?,go,unix,file-permissions,Go,Unix,File Permissions,我需要使用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.

我需要使用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结果不一致,因为
ugtrwxrwx!=0777

文档中的以下引用指出这可能是一个跨平台兼容性问题

FileMode表示文件的模式和权限位。比特数已经过了 所有系统上都有相同的定义,因此有关文件的信息 可以从一个系统移动到另一个便携式系统。并非所有位都适用 适用于所有系统。唯一需要的位是目录的ModeDir

键入FileMode uint32定义的文件模式位最多 文件模式的有效位。九个最低有效位是 标准Unix RWX权限。这些位的值 应被视为公共API的一部分,并可在有线电视中使用 协议或磁盘表示:尽管 可能会添加新的位

这是围棋的限制吗

我需要使用golang来获取给定文件的文件权限(特别是SUID位)

好的,添加以下内容:
fmt.Printf(“文件已设置SUID位:%t\n”,info.Mode()&os.ModeSetuid!=0)

golang的结果不一致,因为UGTRWXRWX!=0777

info.Mode()
info.Mode().Perm()
是不同的东西,尽管它们是相关的

info.Mode().Perm()
包含
info.Mode()
的子集
info.Mode().Perm()
只是一个简单的方便函数,可以按位操作,并使用恒定掩码
0777

这是围棋的限制吗


值得注意的是,除了八进制表示不匹配外,字符串表示也不匹配:

"-rwsrwsrwt" != "ugtrwxrwxrwx"`
这不是由于Go实现的限制,而是以系统不可知的方式实现的结果

来自(我的):

FileMode表示文件的模式和权限位。比特数已经过了 所有系统上都有相同的定义,因此有关文件的信息 可以从一个系统移动到另一个便携式系统并非所有位都适用 适用于所有系统。

因为实现不是为了模仿特定系统的行为,所以不能保证输出与给定环境中的本机工具相匹配。然而,所有的相关数据都可以使用

如果您想模拟
stat
的输出,您可以编写一些逻辑来实现

下面是一个处理八进制表示的快速示例:

package main

import (
    "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.go
FileMode.Perm(): 0777
UnixPerm(): 7777

$ stat --printf "Permissions: %a\n" example_file
Permissions: 7777

我不知道你说的不一致是什么意思。模式的
Perm
部分被定义为低9位。除去
ugtrwxrwxrwx
的低九位之外的所有内容,剩下的就是
rwxrwx
,这正是您所看到的。如果你想要比低9位更多的位,不要去掉其他位。