【问题标题】:os.StartProcess() not allowing for sudo commands in golangos.StartProcess() 不允许在 golang 中使用 sudo 命令
【发布时间】:2021-11-27 03:05:13
【问题描述】:

我正在尝试从无 root 的 golang 程序中启动一个新进程,赋予该进程 root 权限,并使用 sudo 执行命令。但是,我得到以下输出:

sudo: /etc/sudo.conf is owned by uid 65534, should be 0
sudo: /etc/sudo.conf is owned by uid 65534, should be 0
sudo: error in /etc/sudo.conf, line 0 while loading plugin "sudoers_policy"
sudo: /usr/libexec/sudo/sudoers.so must be owned by uid 0
sudo: fatal error, unable to load plugins
exit status 1

我假设这意味着我需要临时 chown 一些文件才能获得 sudo 访问权限。这个过程可能吗?这是我目前的 StartProcess 代码

cred := &syscall.Credential{0, 0, []uint32{}, false}
sys := &syscall.SysProcAttr{Credential: cred, Noctty: false}
attr := os.ProcAttr{Env: os.Environ(), Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, Sys: sys}
proc, err := os.StartProcess("/bin/sudo", []string{"/bin/podman", "image", "load", "--input=" + scpOpts.Save.Output}, &attr)
if err != nil {
    return err
}

state, err := proc.Wait()
if err != nil {
    return err
}

fmt.Println(state.String())

【问题讨论】:

  • 您尝试运行的命令是否可以在 Go 之外运行?

标签: go exec system-calls root sudo


【解决方案1】:

首先检查您的 /etc 文件夹的所有权:将其设置回根目录(如此处)应该会有所帮助。

您有一个类似的podman issue,它说明了用户所有权的重要性。

OP cbd123 确认在the comments

我的问题是我的 gid 或 uid 映射不正确。

除了syscall.CLONE_NEWUSER 存在一些问题,即由于max_user_namespace 文件而触发无效参数错误之外,我让它工作了。

【讨论】:

  • 我认为问题出在进程开始的 UID/GID 上。我的 /etc 文件夹由 root 适当拥有。
  • @cbd123 我同意。你可以试试proc, err := os.StartProcess("/bin/sudo", []string{"id", "-a") 吗? (检查您的流程中使用了哪个)还有proc, err := os.StartProcess("id", []string{"-a")
  • 我的问题是我的 gid 或 uid 映射不正确。我让它工作了,因为syscall.CLONE_NEWUSER 已经发布了一些由于 max_user_namespace 文件而触发无效参数错误的问题...
  • @cbd123 好的,感谢您的反馈。我已将您的评论添加到答案中以提高知名度。
  • 相关问题如果你想看看:stackoverflow.com/questions/69509844/…
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2013-09-26
相关资源
最近更新 更多