代码之家  ›  专栏  ›  技术社区  ›  Paul Rubel

使用exec时使用setuid。指挥官。开始()[重复]

  •  0
  • Paul Rubel  · 技术社区  · 11 月前

    是否可以配置Cmd来设置以启动的进程的UID+GID exec.Cmd.Start() ? 我在寻找类似的行为 libuv_spawn 在那里,我可以设置UV_PROCESS_set{UID,GID}并将其作为选项传入。

    我最初以为我可以在 SysProcAttr 但这似乎与名称空间有关。

    有没有一种方法不需要我手动调用fork/exec/setuid?

    工作代码

    (感谢@Dave和@JimB) SysProcAttr的凭证字段是魔法发生的地方。

        cmd := exec.CommandContext(context.Background(), "whoami")
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr
        cmd.SysProcAttr = &syscall.SysProcAttr{
            Credential: &syscall.Credential{
                Uid: uint32(myUID),
                Gid: uint32(myGID),
            },
        }
        if err := cmd.Start(); err != nil {
            panic(err)
        }
        if err := cmd.Wait(); err != nil {
            panic(err)
        }
    

    这会输出相应的用户名!

    1 回复  |  直到 11 月前
        1
  •  0
  •   dave    11 月前

    你需要使用操作系统。启动流程:

    attr := &os.ProcAttr{
        Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
        Sys: &syscall.SysProcAttr{
            Credential: &syscall.Credential{
                Uid: uint32(uid),
                Gid: uint32(gid),   
            },
        },
    }
    args := []string{
        "/usr/bin/whoami",
    }
    process, err := os.StartProcess(args[0], args, attr)