登录
首页 >  Golang >  Go问答

权限不足,无法操作 fork/exec /proc/self/exe

来源:stackoverflow

时间:2024-02-07 21:24:22 349浏览 收藏

推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

学习Golang要努力,但是不要急!今天的这篇文章《权限不足,无法操作 fork/exec /proc/self/exe》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我正在关注:从头开始的容器 • liz rice • goto 2018 并在本地测试lizrice/containers-from-scratch源代码以学习容器。

但是使用下面的代码,我无法在 ubuntu 1804 上分叉子进程,下面是我的 main.go

package main

import (
    "fmt"
    "os"
    "os/exec"
    "syscall"
)

// go run main.go run <cmd> <args>
func main() {
    switch os.args[1] {
    case "run":
        run()
    case "child":
        child()
    default:
        panic("help")
    }
}

func run() {
    fmt.printf("in <run> running %v \n", os.args[2:])

    cmd := exec.command("/proc/self/exe", append([]string{"child"}, os.args[2:]...)...)
    cmd.stdin = os.stdin
    cmd.stdout = os.stdout
    cmd.stderr = os.stderr
    cmd.sysprocattr = &syscall.sysprocattr{
    cloneflags:   syscall.clone_newuts,
    }

    must(cmd.run())
}

func child() {
    fmt.printf("in <child> running %v \n", os.args[2:])

    cmd := exec.command(os.args[2], os.args[3:]...)
    cmd.stdin = os.stdin
    cmd.stdout = os.stdout
    cmd.stderr = os.stderr

    syscall.sethostname([]byte("container"))
    must(cmd.run())
}

func must(err error) {
    if err != nil {
        panic(err)
    }
}

我尝试运行它:

go run main1.go run /bin/bash

发生以下错误:

in <run> running [/bin/bash] 
panic: fork/exec /proc/self/exe: operation not permitted

goroutine 1 [running]:
main.must(...)
    /home/jia/cs_study_plan/docker/containers-from-scratch/main1.go:72
main.run()
    /home/jia/cs_study_plan/docker/containers-from-scratch/main1.go:44 +0x27f
main.main()
    /home/jia/cs_study_plan/docker/containers-from-scratch/main1.go:17 +0x4d
exit status 2

有什么建议可以解决我的 main.go 中的此权限问题吗?

谢谢@peter 的建议。 我可以使用“go build”和“sudo”运行我的应用程序

这就是我所做的

1. go to directory of main1.go 
2. go mod init main1 <it must be the same name as main1.go>
3. go mod tidy <it is optional step>
4. gp build
5. main1 is build in current directory
6. run command : 
   sudo ./main1 run /bin/bash
7. child forked successfully , as i can tell from my output
   in <run> running [/bin/bash] 
   in <child> running [/bin/bash]

ps
  pid tty          time cmd
15774 pts/0    00:00:00 sudo
15775 pts/0    00:00:00 main1
15781 pts/0    00:00:00 exe
15786 pts/0    00:00:00 bash
16047 pts/0    00:00:00 ps

我还尝试在我的 ubunut 中禁用“apparmor”,看看这是否是阻止 main1.go 分叉子进程的原因

$sudo systemctl status apparmor
    [sudo] password for jia: 
    ● apparmor.service - AppArmor initialization
       Loaded: loaded (/lib/systemd/system/apparmor.service; enabled; vendor preset: enabled)
       Active: active (exited) since Thu 2022-06-09 08:31:21 CST; 2h 3min ago
         Docs: man:apparmor(7)
               http://wiki.apparmor.net/
     Main PID: 660 (code=exited, status=0/SUCCESS)
        Tasks: 0 (limit: 4915)
       CGroup: /system.slice/apparmor.service
    
    Jun 09 08:31:21 ub1804 apparmor[660]:  * Starting AppArmor profiles
    Jun 09 08:31:21 ub1804 apparmor[660]: Skipping profile in /etc/apparmor.d/disable: usr.bin.firefox
    Jun 09 08:31:21 ub1804 apparmor[660]: Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd
    Jun 09 08:31:21 ub1804 systemd[1]: Starting AppArmor initialization...
    Jun 09 08:31:21 ub1804 apparmor[660]:    ...done.
    Jun 09 08:31:21 ub1804 systemd[1]: Started AppArmor initialization.

$sudo systemctl stop apparmor

$go run main1.go run echo hello
In <Run> Running [echo hello] 
panic: fork/exec /proc/self/exe: operation not permitted

不走运,如果有人知道是什么阻止了我的 main1.go fork child,请告诉我,提前致谢


正确答案


出现您的问题是因为 Ubuntu 预装了 sudo,因此您的用户权限受到限制。根据 proc 文档,它提供了内核数据结构的接口并代表了伪文件系统。 /proc 由系统本身以只读方式安装,但您正尝试在该文件系统内创建一个新进程,该文件系统对当前用户来说是只读的。 您可以在 man https://man7.org/linux/man-pages/man5/proc.5.html 中阅读更多相关信息

TL;DR:您需要以 root 身份运行您的程序。

好了,本文到此结束,带大家了解了《权限不足,无法操作 fork/exec /proc/self/exe》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>