Я хотел бы запустить следующую команду из моего проекта Cocoa. (скрывает значок прожектора)
sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search
Я нашел два способа, как вызвать команду и получить следующий вывод
1) Использование NSTask
NSTask *writeTask = [[NSTask alloc] init];
[writeTask setLaunchPath:@"/bin/chmod"];
[writeTask setArguments: @[@"755",@"/System/Library/CoreServices/Search.bundle/Contents/MacOS/Search"]];
[writeTask launch];
>>chmod: Unable to change file mode on /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search: Operation not permitted
2) Трубы
NSString *command = @"sudo chmod 755/System/Library/CoreServices/Search.bundle/Contents/MacOS/Search";
fp = popen([command UTF8String], "r");
>>sudo: no tty present and no askpass program specified
Я не нашел способ запустить любой из них в режиме суперпользователя. Как я могу предложить пользователю ввести свой пароль и в конечном итоге запустить эту команду с необходимыми привилегиями?
Ответ 1 · рейтинг 1 · Neha
Напишите приведенный ниже сценарий Apple, используя Apple Script Editor, и сохраните его в файле .scpt.
do shell script "sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search" with administrator privileges
Теперь добавьте этот файл в свой пакет.
Затем, чтобы вызвать этот скрипт из вашей программы, используйте следующий код:
- (void) runEmbeddedScriptFile: (NSString*)fileName
{
NSString* path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"scpt"];
NSURL* url = [NSURL fileURLWithPath:path];
NSDictionary* errors = [NSDictionary dictionary];
NSAppleScript* appleScript = [[NSAppleScript alloc] initWithContentsOfURL:url error:&errors];
[appleScript executeAndReturnError:nil];
[appleScript release];
}
Это вызовет запрос пароля от пользователя.
Ответ 2 · рейтинг 2 · Suhas
До версии 10.7 вы могли использовать AuthorizationExecuteWithPrivileges() для выполнения задач с привилегиями. Однако в версии 10.7 это устарело, и Apple рекомендует использовать платформу ServiceManagement для выполнения привилегированных задач.
SMJobBless демонстрирует, как безопасно установить вспомогательный инструмент, выполняющий привилегированную операцию, и как связать этот инструмент с приложением, которое его вызывает.
SMJobBless использует ServiceManagement.framework, представленный в Mac OS X v10.6 Snow Leopard.
Что касается Snow Leopard, это предпочтительный метод управления повышением привилегий в Mac OS X, и его следует использовать вместо более ранних подходов, таких как BetterAuthorizationSample или прямого вызова AuthorizationExecuteWithPrivileges.
пример кода от Apple