你使用的Go版本是什么( go version
)?
$ go version
go version go1.17.3 linux/amd64
这个问题在最新版本中是否会重现?
是的。不太确定它是否与#46776有关
你正在使用什么操作系统和处理器架构( go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/user/.cache/go-build"
GOENV="/home/user/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/user/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/user/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.17.3"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/user/gomodule/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3099453485=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
测试了go文件
package x
import (
"fmt"
"io/fs"
"os"
"path/filepath"
"strings"
)
func fileExists(fileSystem fs.FS, fileName string) (bool, error) {
_, err := fs.Stat(fileSystem, fileName)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, fmt.Errorf("File %q does not exist.", fileName)
}
return false, err // test case should return here
}
func FileValid(fileSystem fs.FS, fileName string) (string, error) {
fileExists, err := fileExists(fileSystem, fileName)
if !fileExists || err != nil {
return "", err
}
return "success", nil
}
测试了测试go文件
package x
import (
"io/fs"
"testing"
"testing/fstest"
)
var (
fakeFS = fstest.MapFS{
"secret-folder": {Mode: 0000},
"secret-folder/readme.md": {},
}
)
func TestFileValidPermissionDenied(t *testing.T) {
fileName := "readme.md"
fsys, _ := fs.Sub(fakeFS, "secret-folder")
wantOut := ""
out, err := FileValid(fsys, fileName)
if out != wantOut || err == nil {
t.Errorf("want %q, nil got %q, %v", wantOut, out, err)
}
}
你期望看到什么?
这个测试应该通过,返回空字符串,并报错权限被拒绝。
你实际上看到了什么?
即使没有文件夹的权限,它仍然可以访问该文件。
6条答案
按热度按时间z5btuh9x1#
注意
0000
==0
== 未设置gr8qqesn2#
在文档中没有找到这个。但我找到了一个Go教程,解释0000表示没有权限 https://schadokar.dev/to-the-point/how-to-read-and-write-a-file-in-golang/
这有意义吗?如何给等同于chmod 0000或000的权限?
628mspwn3#
我认为是CC @bcmills?
fhg3lkii4#
(这确实不是我的领域,但我今天一直在查看
io/fs
。)看起来文件的快速路径在这里:
https://cs.opensource.google/go/go/+/refs/tags/go1.17.6:src/testing/fstest/mapfs.go;l=51-55;drc=d6aa162f30d63f21f5f4db75e302dbb90595bbe2
它的确完全不检查父权限,不过请注意,
fs.FS.Open
方法也没有为ModePerm
位指定详细语义。uqdfh47h5#
我可以帮你做其他事情吗?我刚接触Golang,如果需要的话,可能需要一些指导来修复PR。
ogq8wdun6#
我在野外遇到了同样的问题。这个GitHub issue被标记为“需要调查”,所以我根据最初的错误报告编写了一个简单的可复现测试用例: