2009-09-13 5 views
6

나는 실행할 수있는 셸 명령을 신속하게 입력 할 수있는 간단한 응용 프로그램을 만들고 있습니다. 완벽하게 작동하지만 sudo 명령의 문제점이 있습니다. 현재 sudo 명령을 감지 한 다음 설치 프로그램에서 볼 수있는 것처럼 사용자 암호에 대한 인증 창을 표시하려고 시도합니다. 내가 아는 한, 지금Mac 응용 프로그램에서 관리자 권한으로 승격

SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment]; 
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil]){ 
    //authorized, now run the command using NSTask. 
}else{ 
    //fail 
} 

이 완전히 완전히 잘못된 것입니다 : 그것은이 sudo는 명령입니다 감지하면

여기에 코드입니다. 이것은 내가 문서화 한 것입니다. 어떤 아이디어?

답변

1

보안이 어렵습니다. 문서를 바꾸어서 코드 스 니펫을 제공 할 수는 있지만 잘못된 것일 수 있습니다. 더욱이 내 고급 설명이 맞더라도 보안을 약화시킬 코드 스 니펫의 작은 버그가있을 가능성이 큽니다.

권한 상승 문제로 혼란 스러울 경우 가장 좋은 방법은 문서를 읽고 제공된 샘플을 사용하는 것입니다.

https://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995-CH204-TP1

1

당신이처럼 AuthorizationExecuteWithPrivileges 기능을 사용할 수 있습니다 : BSD 나는 사용자가에서 임의의 명령을 실행할 두지 않을 것을 권 해드립니다 섬세하고 심술 꽃이 점을 감안

- (IBAction)touch: (id) sender { 

    NSString * filepath = [_filepathfield stringValue]; 
    FILE *commpipe = NULL; 
    OSStatus execstatus; 


    NSLog(@"file path is %@", filepath); 

    char *args[] = {[filepath cString], NULL}; 


    SFAuthorization * authorization = [SFAuthorization authorization]; 

    execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef], 
                "/usr/bin/touch", 
                kAuthorizationFlagDefaults, 
                args, 
                &commpipe); 

    if (execstatus == errAuthorizationSuccess) 
    NSlog(@"Toot! It worked"); 
    else 
    NSLog(@"No dice"); 

} 

루트로 응용 프로그램.

/강의

귀하의 예제 코드는 그 자체가 사용자로부터 자신의 프로그램의 기능을 제한하려는 경우 이동하는 방법의 시작이다. 예를 들어, 특정 사용자 만 저장된 파일에서 데이터를 변경할 수있는 앱이있을 수 있습니다. 따라서 보안 데이터베이스 'com.mycompany.LibraryApp.AlterData'에 항목을 만들고 데이터를 변경하려고 할 때 해당 권한이 있는지 확인하십시오. 그러나 그것은 완전히 다른 주제입니다 ...

도움이 되길, -p.

+0

하지만 NSTask를 실행하지 않습니다. 어떤 아이디어를 권한을 사용하여 NSTask를 실행하는 방법? –

1

나는 그것이 정말로 오래된 질문이라는 것을 알고 있지만, 여전히 답을 찾고있는 사람들에게는 여기에 있습니다. 물론,의

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"do shell script \"[YOUR SCRIPT HERE]\" with administrator privileges"]; 

, 스크립트와 [여기 SCRIPT]를 교체하고, 문자열, 코코아 방법을 탈출해야합니다 (그것은 애플 스크립트를 사용한다).

NSDictionary *errorInfo; 
[script executeAndReturnError:&errorInfo]; 

자세한 설명은 의견을 말하십시오.

관련 문제