2011-04-14 141 views
3

我在可可初學者...AuthorizationExecuteWithPrivileges()作爲根的錯誤

我只是想啓動Apache和我的可可應用等過程。

這裏是我的代碼:

OSStatus myStatus; 
    AuthorizationFlags myFlags = kAuthorizationFlagDefaults; 
    AuthorizationRef myAuthorizationRef; 
    FILE *pipe = NULL; 
    myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, myFlags, &myAuthorizationRef); 
    AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0}; 
    AuthorizationRights myRights = {1, &myItems}; 
    myFlags = kAuthorizationFlagDefaults | 
    kAuthorizationFlagInteractionAllowed | 
    kAuthorizationFlagPreAuthorize | 
    kAuthorizationFlagExtendRights; 
    myStatus = AuthorizationCopyPrivilegedReference (&myAuthorizationRef,kAuthorizationFlagDefaults); 
    myStatus = AuthorizationCopyRights (myAuthorizationRef,&myRights, NULL, myFlags, NULL); 

    char *tool = "/usr/sbin/apachectl"; 
    char *args[] = { "start",NULL} ;  

    myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe); 
    char c[100]; 
    int n=fread(c,1,100,pipe); 
    c[n] = '\0'; 
    NSLog(@"%s\n",c); 

theResult:此操作需要根
當我運行一個'WHOAMI',我 '根'但是當我運行的getuid(),我 '501' ...

我嘗試使用設置UID(0);但它沒有設置!
你能幫我嗎?
謝謝

回答

0

我將在/ etc/sudoers中爲uid = 501訪問/ usr/sbin/apachectl的用戶定義訪問權限,並執行「sudo/usr/sbin/apachectl」而不是/ usr/sbin/apachectl代碼。

+1

此解決方案效果很好,但它不靈活... – 2011-05-03 07:33:57

0

我面對完全相同的問題! 這是瘋狂的,一個whoami返回「root」,一個root命令返回「root required」! sudoers解決方案可能有效,但我認爲我們將不得不搜索周圍的setuid位,因爲寫在這裏https://github.com/notbrien/OSXSlightlyBetterAuth/blob/master/OSXSlightlyBetterAuth.m#L94

+1

我得到了解決方案... 你只需要用一個NStask調用你的apache命令來創建一個簡單的程序。這個程序必須以setuid(0)開頭;然後構建它,並通過AuthorizationExecuteWithPrivileges運行它。 – pldwan 2011-04-30 14:06:44

+0

我試過了,但不起作用。你可以給我寫一個小例子...謝謝 – 2011-05-03 07:40:38

+1

我編譯這個:http://pastebin.com/dTxrCPdg 然後,我把它放在https://github.com/notbrien/OSXSlightlyBetterAuth/blob/master/OSXSlightlyBetterAuth。 m#L94 – pldwan 2011-05-05 19:16:00

14

我有這個完全相同的問題。 AuthorizationExecuteWithPrivileges允許您將權限升級到root,但不會自動執行(我想保留用戶會話或其他)。

我最終作出將通過AuthorizationExecuteWithPrivileges運行的通用可執行文件,然後將該可執行將setuid爲根目錄,然後exec的你實際上要以root身份運行的過程。

以下是適用於setuid的包裝可執行源:

#include <stdio.h> 

int main(int argc, char** argv) { 
    if (argc < 2) { 
    printf("not enough arguments\n"); 
    return -1; 
    } 
    if (0 != setuid(0)) { 
    printf("setuid failed.\n"); 
    return -3; 
    } 
    int i; 
    char** argvz = (char**)malloc(sizeof(char*) * (argc - 1)); 
    for (i = 1; i < argc; i++) { 
    argvz[i - 1] = argv[i]; 
    } 

    execv(argv[1], argvz); 
    printf("execv returned?\n"); 
    return -2; 
} 

然後,基本上運行(經由AuthorizationExecuteWithPrivileges調用它)它爲:

setuid my-program-to-run and arguments to pass 

它將的setuid如根,然後運行程序有問題與給出的參數。

注意,您AuthorizationExecuteWithPrivileges由於只有PID,是由AuthorizationExecuteWithPrivileges創建將有提升的權限必須調用setuid的(和setuid的將Exec和替換爲自己的過程)。

+1

感謝您的回答我剪切並粘貼它!一個錯誤:execv不知道需要多少個參數,因此需要將argvz的大小增加1,並向結尾添加空指針argvz [argc-1] = NULL;也可以包括以擺脫編譯器警告。 – Colin 2013-05-31 15:36:49