У меня есть приложение, которое требует выполнения команды с помощью sudo. Как я могу запросить пароль и в случае успеха запустить команду sudo с помощью NSTask.
сеанс sudo auth при выполнении команды с использованием NSTask в приложении какао
comment
возможный дубликат Как дать разрешение с помощью NSTask - Objective-c
- person   schedule 09.07.2011
comment
Это не дубликат этого вопроса. Этот вопрос касается фактического использования sudo (хотя я согласен, что правильный ответ — «вместо этого использовать службы авторизации»).
- person Peter Hosey   schedule 09.07.2011
Ответы (2)
Если вы ищете более легкое решение, есть еще один способ. Я написал эту общую реализацию, которая должна достичь того, чего вы хотите:
- (BOOL) runProcessAsAdministrator:(NSString*)scriptPath
withArguments:(NSArray *)arguments
output:(NSString **)output
errorDescription:(NSString **)errorDescription {
NSString * allArgs = [arguments componentsJoinedByString:@" "];
NSString * fullScript = [NSString stringWithFormat:@"%@ %@", scriptPath, allArgs];
NSDictionary *errorInfo = [NSDictionary new];
NSString *script = [NSString stringWithFormat:@"do shell script \"%@\" with administrator privileges", fullScript];
NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];
NSAppleEventDescriptor * eventResult = [appleScript executeAndReturnError:&errorInfo];
// Check errorInfo
if (! eventResult)
{
// Describe common errors
*errorDescription = nil;
if ([errorInfo valueForKey:NSAppleScriptErrorNumber])
{
NSNumber * errorNumber = (NSNumber *)[errorInfo valueForKey:NSAppleScriptErrorNumber];
if ([errorNumber intValue] == -128)
*errorDescription = @"The administrator password is required to do this.";
}
// Set error message from provided message
if (*errorDescription == nil)
{
if ([errorInfo valueForKey:NSAppleScriptErrorMessage])
*errorDescription = (NSString *)[errorInfo valueForKey:NSAppleScriptErrorMessage];
}
return NO;
}
else
{
// Set output to the AppleScript's output
*output = [eventResult stringValue];
return YES;
}
}
Пример использования:
NSString * output = nil;
NSString * processErrorDescription = nil;
BOOL success = [self runProcessAsAdministrator:@"/usr/bin/id"
withArguments:[NSArray arrayWithObjects:@"-un", nil]
output:&output
errorDescription:&processErrorDescription
asAdministrator:YES];
if (!success) // Process failed to run
{
// ...look at errorDescription
}
else
{
// ...process output
}
Подсказка для user950473.
person
Carlos P
schedule
06.03.2013
Воспользуйся услугами авторизации, Люк. (Если вы когда-нибудь видели, что «приложению XYZ требуется пароль администратора для продолжения», то вот как оно реализовано. Оно не использует sudo под листами.)
person
Community
schedule
09.07.2011