Доступ / частный / и т. Д. С - PullRequest
       56

Доступ / частный / и т. Д. С

3 голосов
/ 29 декабря 2010

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

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

спасибо, JNK

Ответы [ 3 ]

5 голосов
/ 29 декабря 2010

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

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

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

1 голос
/ 29 декабря 2010

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

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

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

0 голосов
/ 29 декабря 2010

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

...