Как сменить пользователя в Go с имени пользователя? - PullRequest
2 голосов
/ 13 октября 2010

Я должен выполнить эту команду с заданным именем пользователя; в 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, действуйте осторожно.

1 Ответ

3 голосов
/ 13 октября 2010

Этот пакет http://github.com/kless/go-sysuser может получить доступ к именам пользователей и т. Д.

Пакет syscall имеет вызовы для установки / получения UID и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...