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

时间:2014-02-11 15:25:05

标签: go exec sudo

使用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)
   }
}

1 个答案:

答案 0 :(得分:23)

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

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