如何在用户名中切换Go中的用户?

时间:2010-10-13 03:03:51

标签: 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,小心谨慎。

1 个答案:

答案 0 :(得分:3)

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

syscall package要求设置/获取UID等