如何在go中检查文件是否可执行?



我将如何编写一个函数来检查文件在 Go 中是否可执行?给定一个os.FileInfo,我可以得到os.FileInfo.Mode(),但我在尝试解析权限位时停滞不前。

测试用例:

#!/usr/bin/env bash
function setup() {
mkdir -p test/foo/bar
touch test/foo/bar/{baz.txt,quux.sh}
chmod +x test/foo/bar/quux.sh
}
function teardown() { rm -r ./test }
setup
import (
"os"
"path/filepath"
"fmt"
)
func IsExectuable(mode os.FileMode) bool {
// ???
}
func main() {
filepath.Walk("test", func(path string, info os.FileInfo, err error) error {
if err != nil || info.IsDir() {
return err
}
fmt.Printf("%v %v", path, IsExectuable(info.Mode().Perm()))
}
}
// should print "test/foo/bar/baz.txt false"
//              "test/foo/bar/quux.txt true"

我只关心Unix文件,但如果解决方案也适用于Windows,我会加分。

文件是否可执行存储在Unix权限位(由FileMode.Perm()返回,基本上是最低的9位(0777八进制位掩码(。请注意,由于我们在下面的解决方案中使用了位掩码,无论如何都会屏蔽其他位,因此不需要调用Perm()

它们的含义是:

rwxrwxrwx

其中前 3 位用于所有者,接下来的 3 位用于组,后 3 位用于其他。

要判断文件是否可由其所有者执行,请使用位掩码0100

func IsExecOwner(mode os.FileMode) bool {
return mode&0100 != 0
}

同样,为了判断组是否可执行,请使用位掩码0010

func IsExecGroup(mode os.FileMode) bool {
return mode&0010 != 0
}

其他人使用位掩码0001

func IsExecOther(mode os.FileMode) bool {
return mode&0001 != 0
}

要判断文件是否可通过上述任何一项执行,请使用位掩码0111

func IsExecAny(mode os.FileMode) bool {
return mode&0111 != 0
}

要判断文件是否可以通过上述所有方法执行,请再次使用位掩码0111但检查结果是否等于0111

func IsExecAll(mode os.FileMode) bool {
return mode&0111 == 0111
}

其他注释是正确的,因为文件的权限位不足以最终判断文件是否可由当前用户执行,当然没有文件的所有权。事实上,当前用户的可执行文件在某种意义上是没有意义的,因为对系统来说重要的是当前进程是否可以执行文件,无论当前用户通常是否可以(例如setuid/setgid情况(从说出他们的shell提示符。

我不是go程序员,但我在这里添加了一个函数,我相信它可以执行技巧并使用已经提到的内容。

最新更新