Доступ /Private/etc с помощью c

это может быть простой вопрос, но как мне «запросить» системные/корневые привилегии у пользователя в консольном приложении c. Мне нужно написать в /Private/etc, но я не могу. Это для мак/юникс.

Я видел, как он используется в других консольных командах, например. когда вы запускаете следующую команду: «sudo /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder», Терминал запрашивает ваш пароль. Как мне это сделать?

спасибо, JNK


person JNK    schedule 29.12.2010    source источник
comment
Я нашел решение, просто выполнив команду sudo /path/to/my/c/file...   -  person JNK    schedule 29.12.2010


Ответы (3)


Нет никакого системного вызова, который позволит процессу получить привилегии root. Вы можете ожидать, что seteuid будет работать таким образом, но его могут использовать только процессы с корневыми процессами (непривилегированные процессы могут только устанавливать euid равным uid).

sudo особенный, потому что его исполняемый файл имеет разрешения setuid. Это означает, что когда sudo запускается, он запускается как пользователь, которому он принадлежит (root), а не пользователь, выполняющий его. sudo может проверить, есть ли у вас root-доступ, проверив пароль и прочитав файл конфигурации. Если проверка прошла успешно, она вызывает fork и execve для выполнения запрошенной вами команды.

Чтобы получить привилегии root в непривилегированном приложении, вам придется пройти через некоторые препятствия. Вы можете использовать fork/execve для вызова sudo для вашей собственной команды. После аутентификации у вас будет привилегированный дочерний процесс. Вы можете передать специальный аргумент или переменную среды, чтобы дочерний процесс мог перейти к коду, который должен быть привилегированным. Родительский процесс будет просто ждать завершения дочернего процесса.

person Jay Conrod    schedule 29.12.2010

Способ сделать то, что вы хотите на Mac, это написать «факторизованное приложение», состоящее из части, которая запускается пользователем, и части, которая выполняет привилегированную задачу. Установите привилегированную часть в системный домен launchd и заставьте пользовательский инструмент вызывать ее для работы, требующей специальных разрешений.

Вам необходимо убедиться, что только разрешенное использование привилегированного помощника может происходить, и вы делаете это с помощью Службы авторизации. В пользовательском инструменте вы приобретаете «право», которое затем конвертируете во внешнюю форму и передаете помощнику. Вспомогательный инструмент должен убедиться, что у него есть права, прежде чем он попытается выполнить привилегированную работу.

Другой вариант — написать весь инструмент так, чтобы он корректно завершал работу (что вы должны сделать в любом случае), и попросить пользователей запустить его через sudo, если им нужен привилегированный доступ. Так работает остальная часть UNIX.

person Community    schedule 29.12.2010

Для систем UNIX вам потребуется установить флаг setuid в вашей программе, и она должна проверять действительные учетные данные /etc/passwd и /etc/shadow. Я считаю, что функция crypt(3) используется для хеширования паролей. Насчет Мака не уверен.

person atx    schedule 29.12.2010
comment
Не говоря уже о том, что это не имеет отношения к вопросу об отображении диалогового окна sudo. - person David Thornley; 29.12.2010
comment
Мммм, да, я забыл упомянуть, что вы можете использовать getpass() (который на самом деле устарел), чтобы удалить эхо вводимых символов в терминале, пока вводится пароль. - person atx; 30.12.2010