cmd/go:改进处理tmpdir为非执行文件的情况

xxls0lw8  于 5个月前  发布在  Go
关注(0)|答案(4)|浏览(48)

你正在使用哪个版本的Go( go version )?

$ go version
go version go1.18.2 linux/amd64

这个问题在最新版本中是否重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/daenney/.cache/go-build"
GOENV="/home/daenney/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/daenney/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/daenney/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.18.2"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
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-build2560607780=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

go test 系统上运行 /tmp 作为 noexec 挂载。

你期望看到什么?

测试运行,或者关于如何修复问题的有用建议。

你看到了什么?

fork/exec /tmp/go-build/...: .permission denied
#8451 中添加了新的 GOTMPDIR ,允许用户配置他们的系统来解决这种情况。不幸的是,如果 Go 命令遇到这种情况,它不会向我这样的用户提供那种上下文或建议。
对于使用 systemd 的系统,一个合理的选择可能是默认为 XDG_RUNTIME_DIR (回退到 ( GO ) TMPDIR ),这还有一个额外的好处,就是与用户会话绑定(而不是系统范围内的事情),并且定期清理。检查该环境变量是否定义应该就足够了,因为它是由 pam-systemd (或用户明确设置的)设置的。
无论潜在的默认行为更改如何,我认为如果 go 命令能够输出建议以配置 GOTPMDIR ,在启动测试二进制文件时遇到权限被拒绝的情况时,这对用户会很有帮助。

gzjq41n4

gzjq41n41#

CC @bcmills?听起来至少我们可以改进输出。

pdtvr36n

pdtvr36n2#

可能go testgo run都可以检查EPERM或类似的情况,并通过错误消息给出提示。

ljsrvy3e

ljsrvy3e3#

https://go.dev/cl/406848提到了这个问题:cmd/go: improve handling of tmpdir being noexec

mrphzbgm

mrphzbgm4#

在CL 406848合并后,输出将是:

$ gotip run main.go
go: creating work dir: mkdir /tmp/go-build1759159385: permission denied.
	Run 'go env -w GOTMPDIR=...' to specify another temporary directory.
	For more about GOTMPDIR, see 'go help environment'.

相关问题