2011-11-23 9 views
0

그래서 내 자신의 목적을 위해 수정하려고하는 샘플 응용 프로그램 소스가있다간단합니까? argv [] 변환 *

기본적으로 쉘 스크립트 (아래의 테스트 예제)를 실행하고 있지만 사과의 보안 프레임 워크를 사용하는 privs를 사용하고 있습니다. 원본 소스는 아래 링크 참조).

작동
 // Grab the arguent length 
     int size = strlen(argv[1]); 

     // Grab the first argument 
     char myToolPath[size]; 
     strcpy(myToolPath,argv[1]); 

, 그것은 의미 :

 myFlags = kAuthorizationFlagDefaults;       // 8 
     myStatus = AuthorizationExecuteWithPrivileges     // 9 
     (myAuthorizationRef, myToolPath, myFlags, myArguments, 
     &myCommunicationsPipe); 

나는 그렇게으로 첫 번째 인수로 myToolPath을 추가 할 명령을 수정 한 : 그 샘플 코드에서

#!/bin/bash 
echo [email protected] 
whoami 

우리는 다음과 같은 통과 내가 달릴 때

./compiled_priv_tool /tmp/example.sh 

그것은 내가 사용하고있는 사용자가 아니라 "root"를 반환합니다. 이것은 예

 char *myArguments[] = { "-u", NULL }; 

그래서 내 이전 쉘 예제는 출력을 것이다 샘플 코드에서하는 것입니다

는하지만 지금은이 도우미로 인수를 전달 할 수 있도록하려면 그들은이 배열 에 추가 이 같은 :

./compiled_priv_tool /tmp/example.sh 

-u 
root 

하지만 출력이

같을 것이다, 그래서 ARGV이 스크립트에 포함 할 수있는 동적으로 많은 인수를 전달할 수 있도록하고 싶습니다
./compiled_priv_tool /tmp/example.sh -u user -f file path -b lah 

-u user -f file path -b lah 
root 

C 코드의 인수를 처리 할 필요가 없습니다. 쉘 스크립트 (외부 명령)에 직접 전달해야합니다.

argv []를 가져 와서 ./compiled_priv의 경로 인 인수 0 (char * myArguments를 기대하는 값)을 제외하고 복사하는 경우 간단한 (내 희망을 갖고) 간단한 질문을 heres합니다. 코드처럼. 나는 객관적인 C를 배웠고 C로 시작하지 않았을 것입니다. 그래서 이것은 아마도 꽤 기본적인 것입니다.하지만 for 루프를 시도하고 두 개의 인덱스를 복사했지만 작동하지 않습니다. 뭔가 같은 :

문자 * =이

내가 원하는하지만이 작동하지 않습니다, 그것은 잘못된 초기화를 말하는 것처럼, 그것은 한 경우에도 우리의 끝에 NULL이 필요한 것처럼 보이는 것입니다 argv를 [] myArguments 배열은 NSTask와 매우 비슷합니다. 나는 for 루프를 포함 할 것이지만 non-starter를 포함 할 것이다.

그래서 argv의 내용을 1에서 끝까지 배열하고 끝에 NULL을 추가하고 원본 샘플 코드에서 char * myArguments []와 같은 형식으로 마무리해야합니다. 내가 더 잘 이해한다면 그것은 도움이 될 것이지만 어떤 생각을하게 될까요?여기

http://developer.apple.com/library/mac/documentation/security/conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/TP30000995-CH206-TPXREF33

+0

멋진 코드이므로 보안 태그를 제거하십시오. – rook

답변

2

argv, 당신이 필요로하는 형식 (char * 포인터의 NULL 종료 배열) 이미, 내가 도움이된다면 함께 연주하고 소스에 대한 링크 그래서 당신은 할 수 수행

char **myArguments = &argv[2]; 

(이미 argc 적어도 2 것을 테스트했다고 가정).

+0

잘 작동하지만 컴파일 시간 경고에서 호환되지 않는 포인터 유형에서 초기화를 얻었습니다. – acidprime

+0

@acidprime : argv의 선언은 무엇입니까? 만약'const'이라면'myArguments'를'const char **'로 선언 할 수 있습니다. – caf

+0

참조에 따르면 AuthorizationExecuteWithPrivileges는 4 번째 인수로 char * const * 인수를 기대하므로 설명한대로 변경하면 오류가 발생합니다. – acidprime