我最近用CentOS 6.3在我们的服务器上安装了Go。安装看起来很顺利。但是我做了一个测试“hello world”脚本,当我运行时,我得到了下面的输出。
fork/exec /tmp/go-build967564990/command-line-arguments/_obj/a.out: permission denied
现在运行go env或其他go命令似乎可以工作了。一开始我以为这是一个权限问题,但是作为root用户运行我得到了同样的结果。一个
izj3ouym1#
我今天遇到了这个问题,但是上面的解决方案不起作用。我的解决方案是通过简单地运行:
$ export TMPDIR=~/tmp/
然后我就能让脚本运行了
$ go run hello.go hello, world
唯一的缺点是每次要运行应用程序时都必须运行export TMPDIR。Adam Goforth的荣誉
export TMPDIR
2fjabf4q2#
只是猜测:你的nix可能因为安全原因而禁用了在/tmp中执行程序。它可能在CentOS中是可配置的,但我不知道。替代解决方案:看起来您正在尝试使用go run来执行Go语言程序(它就像脚本一样,C也是脚本)。尝试(假设$GOPATH=~,这是最简单的可能性)而不是正常的构建,即,而不是
go run
$GOPATH=~
me:~/src/foo$ go run main.go
尝试
me:~/src/foo$ go build # main.go should not be necessary here me:~/src/foo$ ./foo
这种方法仍然使用/tmp-whatever来创建二进制文件IIRC,但不会尝试从那里执行它。PS:* 不要 * 以root身份运行这些命令。如果安装正确,就不需要这样做。
uqzxnwby3#
我正在使用Fedora 31,遇到了一个类似的错误,导致我来到这里。我无法运行Jetbrains IntelliJ Ultimate/GoLand使用的Go调试器,而没有fork/exec和permission denied错误。解决方案是:
fork/exec
permission denied
setsebool deny_ptrace 0
有关详细信息,请参见https://fedoraproject.org/wiki/Features/SELinuxDenyPtrace。
0qx6xfy64#
exec.命令返回以下结构:键入命令标准注解:
// Dir specifies the working directory of the command. // If Dir is the empty string, Run runs the command in the // calling process's current directory. Dir string
因此,您可以将exec cmd的路径传递给exec yourself命令:
cmd := exec.Command(xxxxx) cmd.Dir = xxxxPath
然后调用Run()或其他Output()函数
tzdcorbm5#
您可以设置GOTMPDIR,而不是设置可能影响其他程序的TMPDIR:
GOTMPDIR
TMPDIR
mkdir /some/where/gotmp export GOTMPDIR=/some/where/gotmp
然后将export GOTMPDIR=/some/where/gotmp添加到您的配置文件中(即.bash_profile),使变量永久化。
export GOTMPDIR=/some/where/gotmp
.bash_profile
628mspwn6#
对于fix this issue on my Chromebook,我只是将/tmp重新挂载为可执行文件,这样做可能会有安全隐患,但由于go run可以在其他平台上工作,我想可能没有那么糟糕(特别是在本地开发机器上):
/tmp
sudo mount -i -o remount,exec /tmp/
我把这个添加到我的.bash_profile脚本中。
j8yoct9x7#
考虑尝试:
sudo mount -o remount exec /tmp
7条答案
按热度按时间izj3ouym1#
我今天遇到了这个问题,但是上面的解决方案不起作用。我的解决方案是通过简单地运行:
然后我就能让脚本运行了
唯一的缺点是每次要运行应用程序时都必须运行
export TMPDIR
。Adam Goforth的荣誉
2fjabf4q2#
只是猜测:你的nix可能因为安全原因而禁用了在/tmp中执行程序。它可能在CentOS中是可配置的,但我不知道。
替代解决方案:看起来您正在尝试使用
go run
来执行Go语言程序(它就像脚本一样,C也是脚本)。尝试(假设$GOPATH=~
,这是最简单的可能性)而不是正常的构建,即,而不是尝试
这种方法仍然使用/tmp-whatever来创建二进制文件IIRC,但不会尝试从那里执行它。
PS:* 不要 * 以root身份运行这些命令。如果安装正确,就不需要这样做。
uqzxnwby3#
我正在使用Fedora 31,遇到了一个类似的错误,导致我来到这里。我无法运行Jetbrains IntelliJ Ultimate/GoLand使用的Go调试器,而没有
fork/exec
和permission denied
错误。解决方案是:有关详细信息,请参见https://fedoraproject.org/wiki/Features/SELinuxDenyPtrace。
0qx6xfy64#
exec.命令返回以下结构:键入命令
标准注解:
因此,您可以将exec cmd的路径传递给exec yourself命令:
然后调用Run()或其他Output()函数
tzdcorbm5#
您可以设置
GOTMPDIR
,而不是设置可能影响其他程序的TMPDIR
:然后将
export GOTMPDIR=/some/where/gotmp
添加到您的配置文件中(即.bash_profile
),使变量永久化。628mspwn6#
对于fix this issue on my Chromebook,我只是将
/tmp
重新挂载为可执行文件,这样做可能会有安全隐患,但由于go run
可以在其他平台上工作,我想可能没有那么糟糕(特别是在本地开发机器上):我把这个添加到我的
.bash_profile
脚本中。j8yoct9x7#
考虑尝试: