2013-02-18 77 views
1

我想作爲一個系統用戶Android的shell執行命令以其他用戶身份問題

su - system -c "ls -l /" 

這是輸出

[email protected]:/data/xxxx/xxxx # su - system -c "ls -l /" 
su - system -c "ls -l /" 
SuperSU - Copyright (C) 2012 - Chainfire 

它在Android中,我可以的意思是執行以下命令不使用shell來執行另一個用戶的命令?或在二進制文件su中出現問題?

如何讓shell執行另一個用戶?我也嘗試過爲此創建一個shell腳本,但輸出仍然相同。請指教。

設備已經生根。

回答

0

問題是SuperSU包含一個與標準GNU su不兼容的su二進制文件。

如果你編譯su與NDK的android,並替換二進制它會好起來的。

您可以使用此代碼:

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <pwd.h> 
#include <sys/types.h> 
#include <string.h> 
#include <errno.h> 
int main (int ac, char **av, char **env) { 
    int iret; 

    if (ac == 1) { // Run /bin/bash as root 
     iret = setuid(0); 
     if (iret == -1) { 
      fprintf(stderr, "This binary is u-s, use chmod u+s %s as root.\n", av[0]); 
      exit(-1); 
     } 

     strcpy(av[0], "/bin/bash"); 
     iret = execve(av[0], av, env); 
     if (iret == -1) { 
      fprintf(stderr, "Can't execute a shell.\n"); 
      exit(-1); 
     } 
    } else { 
     struct passwd *pswd = getpwnam(av[1]); 
     //printf("%d\n", pswd->pw_uid); 
     if (pswd == NULL) { 
      fprintf(stderr, "User %s does not exist.\n", av[1]); 
      exit(-1); 
     } 
     iret = setuid(pswd->pw_uid); 
     if (iret == -1) { 
      fprintf(stderr, "This binary is u-s, use chmod u+s %s as root.\n", av[0]); 
      exit(-1); 
     } 
     iret = execve(av[2], (char **)&av[2], env); 
     if (iret == -1) { 
      fprintf(stderr, "%s\n", strerror(errno)); 
      exit(-1); 
     } 
    } 
    return 0; 
} 

編譯它,將所有者更改爲根。然後以root身份運行chmod u + s ./su。最後,作爲普通用戶的身份運行命令的時間:

$ ./su系統/斌/慶典-c 「ls -l命令/」

相關問題