сеанс sudo auth при выполнении команды с использованием NSTask в приложении какао

У меня есть приложение, которое требует выполнения команды с помощью sudo. Как я могу запросить пароль и в случае успеха запустить команду sudo с помощью NSTask.


person ed1t    schedule 09.07.2011    source источник
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 под листами.)

http://developer.apple.com/library/mac/#documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html

person Community    schedule 09.07.2011