美文网首页Go语言用例Go知识库
Golang如何让子进程以另一个用户身份运行

Golang如何让子进程以另一个用户身份运行

作者: CodingCode | 来源:发表于2018-05-04 22:50 被阅读11次

    Golang如何让子进程以另一个用户身份运行

    当父进程launch一个子进程的时候,如何使得子进程使用另一个用户身份运行。

    前提条件当前用户得用足够的权限切换到另一个用户,所以通常父进程是root。

    下面的例子是root用户的父进程,如何launch一个子进程,并且使得子进程以nobody的身份在运行(nobody是*nix操作系统的内置账号)。

    package main
    
    import (
        "os"
        "log"
        "syscall"
        "strconv"
        "os/exec"
        "os/user"
    )
    
    func main() {
        cmd := exec.Command("./subcommand")
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr
    
        user, err := user.Lookup("nobody")
        if err == nil {
           log.Printf("uid=%s,gid=%s", user.Uid, user.Gid)
    
           uid, _ := strconv.Atoi(user.Uid)
           gid, _ := strconv.Atoi(user.Gid)
    
           cmd.SysProcAttr = &syscall.SysProcAttr{}
           cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uint32(uid), Gid: uint32(gid)}
        }
    
        err = cmd.Run();
        if err != nil {
            log.Fatal(err)
        }
    }
    

    其中关键的命令就是两行

    cmd.SysProcAttr = &syscall.SysProcAttr{}
    cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uint32(uid), Gid: uint32(gid)}
    

    先查找到nobody用户的uid和gid,然后调用syscall.Credential对象。

    注意上述的操作都需要特权,通常只有root用户才有这个权限。

    相关文章

      网友评论

        本文标题:Golang如何让子进程以另一个用户身份运行

        本文链接:https://www.haomeiwen.com/subject/juijrftx.html