Как запустить NSTask или подпроцесс от имени другого пользователя в macOS - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть программа, которая запускается от имени пользователя root (getuid() возвращает 0).

Мне нужно запустить инструмент командной строки как пользователь, который в данный момент вошел в систему (что я могу определить по получению HOME env var ). (Подробности см. Ниже)

Как мне это сделать, в идеале с помощью NSTask?

Я знаю, как запустить инструмент, используя NSTask в качестве текущего (root) пользователя, поэтому все, что мне нужно, это знать, что мне нужно изменить в этом.

В качестве альтернативы, есть ли способ запустить раздел кода моей программы под другим идентификатором пользователя?

Разработка

В частности, указанная программа запускается AuthorizationExecuteWithPrivileges. Интересно, что это дает программе немного иную среду, как при запуске программы с помощью sudo:

С помощью sudo фактический и эффективный пользователь (от getuid() и geteuid()) оба являются "root".

Однако с AuthorizationExecuteWithPrivileges эффективный пользователь остается тем пользователем, который вызвал эту функцию. Это имеет некоторые странные эффекты, например затем программа использует NSUserDefaults, поскольку они попадают в разные домены, как показывает мое тестирование.

1 Ответ

0 голосов
/ 14 апреля 2019

Кто-то еще предложил использовать функцию fork, а затем вызвать setuid в разветвленном процессе, прежде чем использовать NSTask или system () для запуска внешней команды.

Вот как это будет сделано:

int userID = 501; // or whatever user you need to be
assert (geteuid() == 0); // are we root?
pid_t pid;
if ((pid = fork()) == 0) {
    setuid(userID);
    int res = system("...");
    exit (res);
} else {
    // wait for the forked process to finish
    pid_t endid;
    do {
        int status;
        endid = waitpid (pid, &status, WNOHANG|WUNTRACED);
    } while (endid == 0);
}
...