为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕哥6287543 2022-05-18 14:42:00
我需要使用 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 的限制吗?
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

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


"-rwsrwsrwt" != "ugtrwxrwxrwx"`

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


从文档(强调我的):FileMode


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



查看完整回答
反对 回复 2022-05-18
?
函数式编程

TA贡献1807条经验 获得超9个赞

我需要使用 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()只是一个简单的便利功能,可以使用常量 mask 进行按位与0777

这是go的限制吗?


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号