2 回答

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

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的限制吗?
不
- 2 回答
- 0 关注
- 139 浏览
添加回答
举报