我必须使用给定的用户名执行此命令;在 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/