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

推荐答案

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

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

Go相关问答推荐

Go汇编器命名为Constants

向API网关终结点发出POST请求时出现AWS Lambda With Go:";Rune me.InvalidEntrypoint";错误

golang 的通用 map 功能

GORM Find方法中缺少字段

带有条件的for循环中缺少RETURN语句

Golang文本/模板序列范围

Date.Format正在输出非常奇怪的日期

使用!NOT运算符的Golang文本/模板多个条件

如何在出现错误时停止从通道读取?

如何将验证器标记添加到嵌套字段

Golang:如何在不转义每个动作的情况下呈现模板的模板?

由于 main.go 文件中的本地包导入导致构建 docker 容器时出错

如何处理 Go 的 firebase admin sdk 错误?

go-libp2p - 从流中接收字节

来自洪流公告的奇怪同行字段

将 []float64 像素切片转换为图像

Golang SSH客户端错误无法验证,try 的方法[无公钥],没有支持的方法

为什么 Go 不允许将一个泛型分配给另一个泛型?

Go http标准库中的内存泄漏?

如果在调用 http.Get(url) 时发生错误,我们是否需要关闭响应对象?