英文:
Go fork/exec permission denied error
问题
我最近在我们的CentOS 6.3服务器上安装了Go。安装似乎进行得很顺利。然而,我创建了一个测试的“hello world”脚本,当我运行时,会得到以下输出。
fork/exec /tmp/go-build967564990/command-line-arguments/_obj/a.out: permission denied
现在运行go env或其他go命令似乎都可以正常工作。起初我以为这是一个权限问题,然而以root用户身份运行时,我得到了相同的结果。
英文:
I recently installed Go onto our server with CentOS 6.3. The install appears to have gone fine. However I made a test "hello world" script, and when I run I get the following output.
fork/exec /tmp/go-build967564990/command-line-arguments/_obj/a.out: permission denied
Now running go env or other go commands seem to work. At first I figured it was a permission issue, however running as root user I get the same thing. An
答案1
得分: 25
我今天遇到了这个问题,但是上面的解决方案都没有起作用。我的问题通过简单地运行以下命令解决了:
$ export TMPDIR=~/tmp/
然后我就能够通过以下命令运行脚本了:
$ go run hello.go
hello, world
唯一的缺点是每次想要运行一个应用程序时都需要运行export TMPDIR
命令。
向Adam Goforth致敬
英文:
I encountered this issue today but the solutions above did not work. Mine was fixed by simply running:
$ export TMPDIR=~/tmp/
then I was able to get the script to run with:
$ go run hello.go
hello, world
The only downside is you have to run export TMPDIR
every time you want to run an application.
Kudos to Adam Goforth
答案2
得分: 18
只是猜测:出于安全原因,您的nix可能禁用了在/tmp目录中执行程序的功能。在CentOS中可能是可配置的,但我不知道。
另一种解决方案:看起来您正在尝试使用go run
来执行Go程序(就像C是脚本一样)。尝试使用正常的构建方式,而不是:
me:~/src/foo$ go run main.go
尝试:
me:~/src/foo$ go build # 这里可能不需要main.go
me:~/src/foo$ ./foo
这种方法仍然会使用/tmp-whatever来创建二进制文件,但不会尝试从那里执行它。
PS:不要以root身份运行这些命令。在正确的设置下不需要这样做。
英文:
Just guessing: Your nix perhaps disables for security reasons executing programs in /tmp. It might be configurable in CentOS, but I don't know that.
The alternative solution: It seems you're trying go run
to execute a Go program (which is as script as C is a script). Try (assuming $GOPATH=~
, the easy possibility) instead a normal build, i.e. instead of
me:~/src/foo$ go run main.go
try
me:~/src/foo$ go build # main.go should not be necessary here
me:~/src/foo$ ./foo
This approach will still use /tmp-whatever to create the binary, IIRC, but it will not attempt to execute it from there.
PS: Do not run these command as root. No need for that with correct setup.
答案3
得分: 1
我正在使用Fedora 31,并遇到了一个类似的错误,导致我来到这里。我无法在Jetbrains IntelliJ Ultimate/GoLand中运行Go调试器,因为出现了fork/exec
和permission denied
错误。解决方案是这样的:
setsebool deny_ptrace 0
详细信息请参见https://fedoraproject.org/wiki/Features/SELinuxDenyPtrace。
英文:
I am using Fedora 31 and got a similar error which brought me here. I could not run the Go debugger used by Jetbrains IntelliJ Ultimate/GoLand without fork/exec
& permission denied
error. The solution was this:
setsebool deny_ptrace 0
See https://fedoraproject.org/wiki/Features/SELinuxDenyPtrace for details.
答案4
得分: 1
而不是设置TMPDIR
可能会影响其他程序,你可以设置GOTMPDIR
:
mkdir /some/where/gotmp
export GOTMPDIR=/some/where/gotmp
然后将export GOTMPDIR=/some/where/gotmp
添加到你的配置文件(例如.bash_profile
)中,以使该变量永久生效。
英文:
Instead of settings TMPDIR
which might affect other programs, you can set GOTMPDIR
:
mkdir /some/where/gotmp
export GOTMPDIR=/some/where/gotmp
Then add export GOTMPDIR=/some/where/gotmp
to your profile (i.e. .bash_profile
) to make the variable permanent.
答案5
得分: 0
exec.Command返回的是Cmd类型的结构体。
标准注释:
// Dir指定命令的工作目录。
// 如果Dir为空字符串,则Run在调用进程的当前目录中运行命令。
Dir string
因此,你可以将exec cmd的路径传递给自己的exec命令:
cmd := exec.Command(xxxxx)
cmd.Dir = xxxxPath
然后你可以调用Run()或其他Output()函数。
英文:
exec.Command return this sturct: type Cmd
standard comment:
// 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
so resolve, you can pass the exec cmd's path to exec yourself command:
cmd := exec.Command(xxxxx)
cmd.Dir = xxxxPath
and then you can call Run() or other Output() func
答案6
得分: -2
为了在我的Chromebook上解决这个问题,我只是将/tmp
重新挂载为可执行文件。这样做可能会有安全隐患,但是由于go run
在其他平台上可以工作,我认为可能并不那么糟糕(尤其是在本地开发机上):
sudo mount -i -o remount,exec /tmp/
我将这个命令添加到了我的.bash_profile
脚本中。
英文:
To fix this issue on my Chromebook I just remounted /tmp
as executable. There may be security implications in doing this, but since go run
works on other platforms I figure maybe it's not that bad (especially on a local dev machine):
sudo mount -i -o remount,exec /tmp/
I added this to my .bash_profile
script.
答案7
得分: -4
考虑尝试:
sudo mount -o remount exec /tmp
英文:
Consider trying:
sudo mount -o remount exec /tmp
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论