Запустите скрипт Bash от имени пользователя root с помощью Objective-C / Cocoa - PullRequest
3 голосов
/ 11 февраля 2010

Учитывая, что в папке Resources в проекте xCode есть файл с именем copystuff, и этот файл читает:

#!/bin/sh
cp -R /Users/someuser/Documents /Users/admin/Desktop

И если этот фрагмент кода ниже связан с кнопкой в ​​IB ... он скопирует каталог / Users / someuser / Documents в / Users / admin при нажатии кнопки в приложении Какао ... Это работает когда приложение запускается в учетной записи администратора (здесь используется OS X 10.5.x) ...

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithObjects:[[NSBundle mainBundle]
pathForResource:@"copystuff" ofType:@"sh"], nil]];
[task launch];

У меня вопрос: есть ли способ заставить NSTask запускать скрипт, работающий от имени пользователя root, когда этот код вызывается из учетной записи не администратора? Или спросили другой способ ... можно ли кодировать Objective-C для запуска скриптов из скажем / usr / bin от имени пользователя root без учетной записи администратора?

Ответы [ 2 ]

7 голосов
/ 11 февраля 2010

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

4 голосов
/ 11 февраля 2010

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

Сценарии оболочки setuid считаются гигантской угрозой безопасности, поэтому ядро ​​не разрешает их использовать. Однако если вы хотите написать отдельную исполняемую программу, вы можете установить для нее биты set-user-ID-on-execute или set-group-ID-on-execute и получить желаемое поведение. Будьте осторожны, теперь вы находитесь в стране больших потенциальных проблем с безопасностью ...

man chmod для получения дополнительной информации.

Вот быстрый и грязный пример:

$ echo "Hello, world!" > file
$ sudo chown root file
$ sudo chmod 600 file
$ cat file
cat: file: Permission denied

Но я могу написать программу:

#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
  setuid(0);
  system("cat file");
  return 0;
}

Что может делать то, что мы хотели бы:

$ cc -Wall -o app main.c
$ chown root app
$ chmod 4755 app
$ ./app
Hello, world!
...