2016-03-19 10 views
0

Я разрабатываю приложение Mac Cocoa, которое должно запускать второе приложение. Ниже приводится соответствующая форма второго приложения, которое мне нужно, чтобы запуститьМожно ли запустить root, выполнив вход пользователя с помощью getuid()?

int main(int argc, const char * argv[]) { 
    uid_t   gRealUserID = getuid(); 
    printf("User id:%d\n",gRealUserID); 
    return 0; 
} 

Проблема заключается в том, что второй терминал приложение должно работать корень, а также «getuid()» получить вошедшего в user.My первое приложение работает с привилегиями root.

так короче, если я построю приведенный выше код к исполняемым под названием «тест» и запустить в терминале

$ ./test 
User id:501 

если мы запустим

$ sudo ./test 
User id:0 

Я хочу знать, есть ли возможный путь с помощью которого, если я приказываю как

$ sudo ./test 

гравюр

User id:501 

Интересное наблюдение: Если я разрешаю корень привилегию не корневого приложения с помощью SFAuthorization он работает как expected..But, к сожалению, я не могу сделать это сейчас, сделать какой-то потребности клиента изменения

ответ

1

sudo запускает программу, как если бы она была запущена корнем, следовательно getuid возвращает 0. Что я думаю, что вы ищете, это set user ID program - это параметр режима файла, который устанавливает эффективный UID программы для права владельца исполняемого файла, поэтому ex ecutable, принадлежащий root, выполняется с эффективным идентификатором корня, но real ID пользователя, запускающего программу.

См. Инструкции по эксплуатации для chmod(2), geteuid(2), getuid(2) и т.п. для деталей.

HTH

+0

спасибо @CRD Я попытаюсь .. но почему при использовании SFAuthorization autharization работает? –

+0

Авторизация работает в обоих случаях, именно так настраиваются реальные и эффективные идентификаторы. Если вы прочитаете эти данные, вы узнаете, как программа UID для набора может создать установку 'sudo' - действительно делает' ls -l/usr/bin/sudo', и вы увидите, что это заданная программа UID. – CRD

+0

Спасибо @CRD 'setuid()' форма первого приложения сделала трюк –

Смежные вопросы