go - 如何在 Go 中从用户名切换用户?

标签 go

我必须使用给定的用户名执行此命令;在 bash 中是这样的,

$su devrim -c "touch miki"

我猜,首先我需要从用户名中获取 uid,并在执行 ForkExec 之前使用 setuid。

你能给点建议吗?我该怎么做呢 ? (ps:我没有uid,只有用户名)

func exec(cmd *Command, async bool) os.Error {
    parts := strings.Fields(cmd.Command)
    command := parts[0]

    // cmd.Su holds the username "root" or "myUser"

    pid, err := os.ForkExec(command, parts, os.Environ(), "", []*os.File{nil, cmd.Stdout, cmd.Stderr})
    cmd.Pid = pid

    if !async {
        os.Wait(pid, 0)
    }
    return nil
}

编辑:因为 sysuser 的东西不起作用,而且我看到它只是解析/etc/passwd 我决定自己做:

func getUid(su string) int{

    passwd,_ := os.Open("/etc/passwd", os.O_RDONLY , 0600)

    reader := bufio.NewReader(passwd)

    for {
        line,err := reader.ReadString('\n')
        if err != nil { 
            println(err.String()) 
            break
        }

        parsed := strings.Split(line,":",4)

        if parsed[0] == su {
            value,_ := strconv.Atoi(parsed[2])
            return value
        }
    }

    return -1
}

我不确定所有/etc/passwd 的格式是否与 *nix 的相同,我们使用 debian 和 ubuntu,请小心操作。

最佳答案

这个包http://github.com/kless/go-sysuser可以访问用户名等。

syscall package调用 Set/Get UID 等。

关于go - 如何在 Go 中从用户名切换用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3920491/

相关文章:

当 bitSize 参数使用 32 时,Golang strconv.ParseFloat 无法正确解析字符串

go - 如何将字符串值分配给 GO 中的时间格式?

go - slice 的容量

tomcat - 在go中解析tomcat日志文件的时间戳

go - (*SomeStruct)(nil) 是什么意思?

ssl - 从私钥中提取公钥

go - 如何获取 Kubernetes 上 pod 的真实和实际存储使用情况?

go - 尝试从 gorilla SecureCookie读取时返回空 map

go - 如何在本地运行 pkg.go.dev 作为 godoc 替代品?

git - 命令 go get -u 命令出错。无法获取包裹