команда sudo chmod из какао

Я хотел бы запустить следующую команду из моего проекта 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

Я не нашел способ запустить любой из них в режиме суперпользователя. Как я могу предложить пользователю ввести свой пароль и в конечном итоге запустить эту команду с необходимыми привилегиями?


person keith.g    schedule 19.11.2013    source источник
comment
возможный дубликат AuthorizationExecuteWithPrivileges устарел   -  person Parag Bafna    schedule 19.11.2013


Ответы (3)


Напишите приведенный ниже сценарий 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];
}

Это вызовет запрос пароля от пользователя.

person Neha    schedule 19.11.2013

До версии 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

person Suhas    schedule 19.11.2013

Чтобы получить привилегии root, а затем использовать chmod() из sys/stat.h

person Mahadev Kale    schedule 19.11.2013