通过os/exec在另一个用户下运行外部命令

mcu*_*ros 17 sudo exec go

使用该os/exec包,我想代表另一个用户在*nix OS上运行外部命令(当然是在具有su权限的另一个用户的root用户下运行进程)

我想避免使用"su"或"bash"命令,并将其与go完全一致.

我使用了一个方法,syscall.Setuid但这会将用户更改为主项目,我只需要将用户更改为外部子进程:

func (self *Command) LoseTo(username string) {
   u, err := user.Lookup(username)
   if err != nil {
      fmt.Printf("%v", err)
   }

   uid, err := strconv.Atoi(u.Uid)
   if err := syscall.Setuid(uid); err != nil {
      fmt.Printf("%v", err)
   }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 26

您可以向Cmd.SysProcAttr添加syscall.Credential结构

cmd := exec.Command(command, args...)
cmd.SysProcAttr = &syscall.SysProcAttr{}
cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uid, Gid: gid}
Run Code Online (Sandbox Code Playgroud)