Хорошо, я столкнулся с этим, когда искал, как это сделать правильно ... Я знаю, что это, вероятно, наименее безопасный способ выполнения задачи, но, вероятно, самый простой, и я нигде не видел этот ответ.Я придумал это для приложений, которые я создаю, чтобы запускать для своих собственных целей и как временную процедуру авторизации для типа задачи, которую описывает user142019.Я не думаю, что Apple одобрит.Это всего лишь фрагмент и не включает в себя форму ввода пользовательского интерфейса или какой-либо способ захвата stdout, но есть множество других ресурсов, которые могут предоставить эти фрагменты.
Создайте пустой файл с именем «script.sh» идобавьте его в файлы поддержки вашего проекта.
Добавьте это в заголовочный файл:
// set this from IBOutlets or encrypted file
@property (strong, nonatomic) NSString * password;
@property (strong, nonatomic) NSString * command;
реализация:
@synthesize password;
@synthesize command;
(IBAction)buttonExecute:(id)sender {
NSString *scriptPath = [[NSBundle mainBundle]pathForResource:@"script" ofType:@"sh"];
NSString *scriptText = [[NSString alloc]initWithFormat:@"#! usr/sh/echo\n%@ | sudo -S %@",password,command];
[scriptText writeToFile:scriptPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSTask * task = [[NSTask alloc]init];
[task setLaunchPath:@"/bin/sh"];
NSArray * args = [NSArray arrayWithObjects:scriptPath, nil];
[task setArguments:args];
[task launch];
NSString * blank = @" ";
[blank writeToFile:scriptPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
Последний шаг заключается в том, чтобы у вас не было открытого пароля администратора в вашем комплекте.Я рекомендую убедиться, что все, что находится за пределами метода, каким-то образом запутано.