【问题标题】:How to switch user in Go from username?如何从用户名切换用户?
【发布时间】:2011-04-24 15:28:32
【问题描述】:

我必须用给定的用户名执行这个命令;在 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,请谨慎操作。

【问题讨论】:

    标签: go


    【解决方案1】:

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

    syscall package 调用了设置/获取 UID 等。

    【讨论】:

    • 谢谢你!尽管它会引发错误并且无法安装,但它绝对是我正在寻找的。​​span>
    • @Devrim 啊,好吧,我实际上并没有使用它。但这可能只是一个 makefile 问题,或者只需要稍作更改即可与最新的 go 版本同步
    • sysuser 只是解析,没有本地 go 方法来做。所以我自己解析了它 - 解决方案在上面。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多