使用该os/exec软件包,我想代表另一个用户在* nix操作系统上运行外部命令(当然go进程在具有su特权的另一个用户的root用户下运行)
os/exec
我想避免使用“ su”或“ bash”命令,而只使用go即可。
我使用了一种方法,syscall.Setuid但这会将用户更改为主项目,我只需要将用户更改为外部子进程即可:
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) } }
您可以将syscall.Credential结构添加到Cmd.SysProcAttr
cmd := exec.Command(command, args...) cmd.SysProcAttr = &syscall.SysProcAttr{} cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uid, Gid: gid}