Скрипт запуска NSTask

Я пытаюсь запустить следующую команду с NSTask:

$sudo launchctl load /Users/admin/Library/LaunchAgents/com.devdaily.crontabtest.plist

Ниже приведен код, который я использую:

NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/launchctl"];
[server setArguments:[NSArray arrayWithObjects:@"load",@"com.devdaily.crontabtest.plist",nil]];
[server setCurrentDirectoryPath:@"/Users/admin/Library/LaunchAgents/"];

NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];

[server launch];
[server waitUntilExit]; // Alternatively, make it asynchronous.
[server release];

Однако это не работает из-за команды sudo. Как я могу это исправить?


person Pavel    schedule 08.05.2012    source источник
comment
Использование sudo в неконсольной среде не очень полезно, потому что нет простого способа ввести пароль (да, вы можете использовать стандартный канал ввода, но гораздо лучше использовать встроенные утилиты эскалации OS X). Во-вторых, я предполагаю, что sh не загружает sudo, потому что он не загружает путь.   -  person RC Howe    schedule 08.05.2012


Ответы (2)


К сожалению, нельзя. Потому что нет возможности ввести пароль.

Тем не менее, вы все равно можете запустить команду bash, используя NSAppleScript вместо NSTask: напишите яблочный скрипт, например:

do shell script [your command] with administrator privileges

У вас будет запрошен пароль администратора.

Пример:

NSDictionary *error = [NSDictionary new]; 
NSString *script =  @"do shell script \"launchctl load /Users/admin/Library/LaunchAgents/com.devdaily.crontabtest.plist\" with administrator privileges";  
NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script]; 
if ([appleScript executeAndReturnError:&error]) {
  NSLog(@"success!"); 
} else {
  NSLog(@"failure!"); 
}
person Jean    schedule 24.03.2013

Прочтите Руководство по безопасному кодированию от Apple и следуйте рекомендациям. для безопасного повышения привилегий.

Другими словами, не используйте sudo или что-то подобное. Используйте SMJobBless() для установки и включения агента запуска. См. также пример проекта SMJobBless.

person Ken Thomases    schedule 24.03.2013