如何使用Go检查linux中的文件权限

时间:2017-08-01 04:54:37

标签: linux go

我正在学习Go,我想要做的第一个项目是编写Linux find shell程序的替代品。我在不到一个小时的时间内在python中写了一个替代品。这是一个更大的挑战。

我遇到的问题是Goes filepath.Walk遍历我的文件系统,它向屏幕吐出一堆权限被拒绝的消息。 我需要一种在filepath.Walk触摸它们之前检查文件权限的方法。

2 个答案:

答案 0 :(得分:4)

go中,文件权限在os.FileMode中定义,其中基础类型为uint32。来自文档:

  

FileMode表示文件的模式和权限位...
  ...
  定义的文件模式位是FileMode的最高有效位。九个最低有效位是标准的Unix rwxrwxrwx权限。这些位的值应被视为公共API的一部分,并且可以用于有线协议或磁盘表示:尽管可能会添加新位,但不得更改它们。

您可以检索返回os.StatFileModeos.LStatFileInfo函数,例如

info, err := os.Stat("file/directory name")

然后可以通过调用FileMode获取info.Mode()。要检查权限,请对模式位执行按位操作,例如

//Check 'others' permission
m := info.Mode()
if m&(1<<2) != 0 {
    //other users have read permission
} else {
    //other users don't have read permission
}

如果您使用filepath.Walk函数访问目录/文件,因为WalkFuncWalk的第二个参数)被定义为

type WalkFunc func(path string, info os.FileInfo, err error) error
某些路径FileInfo可用作WalkFunc的第二个参数,因此您可以直接在函数体内检查权限,而无需调用os.Statos.Lstat

答案 1 :(得分:0)

您可以以字符串形式检索权限 e.i: r, w, x。像这样:

func printPermissions(filename string) {
    info, err := os.Stat(filename)
    if err != nil {
        panic(err)
    }

    mode := info.Mode()

    fmt.Print("Owner: ")
    for i := 1; i < 4; i++ {
        fmt.Print(string(mode.String()[i]))
    }

    fmt.Print("\nGroup: ")
    for i := 4; i < 7; i++ {
        fmt.Print(string(mode.String()[i]))
    }

    fmt.Print("\nOther: ")
    for i := 7; i < 10; i++ {
        fmt.Print(string(mode.String()[i]))
    }
}