【问题标题】:Is there a function for finding the full file permissions?是否有查找完整文件权限的功能?
【发布时间】: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


【解决方案1】:

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

"-rwsrwsrwt" != "ugtrwxrwxrwx"`

这不是由于 Go 实现的限制,而是它以与系统无关的方式实现的结果。

来自the FileMode documentation(强调我的):

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

【讨论】:

    【解决方案2】:

    我需要使用 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 进行按位与运算。

    这是go的限制吗?

    没有

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多