Go 是否有查找完整文件权限的功能?
我需要使用Go来获取给定文件(特别是SUID位)的文件权限。下面是一个示例文件的权限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.
$ 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位更多的位,不要去掉其他位。