Я должен выполнить эту команду с заданным именем пользователя; в Bash это было бы,
$su devrim -c "touch miki"
Я думаю, сначала мне нужно получить uid от имени пользователя и использовать setuid перед выполнением ForkExec.
можешь совет? Как мне это сделать ? (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
}
edit: так как эта функция 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, действуйте осторожно.