2011-10-16 5 views
2

나를 용서해주세요, 나는 핵심 리눅스 프로그래머가 아닙니다. 이것은 내가 처음 리눅스 코딩을 한 것이므로 나와 함께 맨 처음이다.안드로이드 애플 리케이션에서 쉘 스크립트 실행

그래서이 주제에 대한 수많은 게시물을 읽었으며 코드에 어떤 문제가 있는지 파악하는 데 어려움이 있습니다. 기본적으로 프로필 앱을 만들려고합니다. 장치가 뿌리이며 BusyBox를 포함합니다. 로그인 한 사용자에 따라/data 및/cache 파티션을 스왑 아웃하는 리눅스 스크립트를 작성했습니다.

ADB에서이 스크립트를 실행할 때 완벽하게 작동합니다. 나는 그것을 애플 리케이션에서 구현하는 것이 매우 쉽다는 것을 알았다.

# SP 로그인 사용자 이름 암호

안드로이드는 새 프로필로 다시 초기화하고 모든이 좋다. 이것은 내가 안드로이드에있는 것입니다 :

Log.v("Profiles", "sp login " + user + " " + password); 
Process process = Runtime.getRuntime().exec("sp login " + user + " " + password); 

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
int read; 
char[] buffer = new char[4096]; 
StringBuffer output = new StringBuffer(); 
while ((read = reader.read(buffer)) > 0) { 
    output.append(buffer, 0, read); 
} 
reader.close(); 
process.waitFor(); 
Log.v("Profiles", output.toString()); 

그 기록 만 밖으로는 실제 스크립트 자체에 내 "에코을"입니다. 그 스크립트에서 수행 된 명령의 결과를 보지 못합니다. 예를 들어, ADB에서 실행될 때, 모든 마운트 명령과 내가하고있는 여러 가지 작업이 모두 출력됩니다. 이 모든 것은 출력 문자열에 출력되지 않습니다.

제안 사항?

+0

은'password'는'등의 쉘 메타 문자가 포함 된 경우,'또는'&'또는'*'또는''당신'간부는()'호출이 당신으로 실행되지 않을 수 있습니다?를 배고 있다. 안드로이드가'execve (2)'와 같은 것보다는'system (3)'과 같은 것 같은 것에 접근 할 수 있다면 그것을 사용하는 것이 현명 할 것입니다. (비록 내가 당신의 현재 문제와 관련 있다고 생각하지 않지만.) – sarnold

+0

Nope. 암호에는 특수 문자가 없습니다. 그저 확인해야 할 것이지만 단순한 문자열입니다. 또한 안드로이드는 비록 그것에 대해 많이 알지는 못한다고하더라도 execve가없는 것 같습니다. – normmcgarry

답변

0

쉘 스크립트를 실행할 프로세스에 "su"를 실행해야합니다.

그렇지 않으면이 프로세스에 이미 루트 권한이있는 장치까지 루트 권한이 없습니다.

아래 코드는 참조 용 예입니다.

public void RunAsRoot(String[] cmds){ 
    try{ 
     Process p = Runtime.getRuntime().exec("su"); 
     DataOutputStream os = new DataOutputStream(p.getOutputStream()); 
     for(String tmpCmds : cmds){ 
      os.writeBytes(tmpCmds+"\n"); 
      os.flush(); 
      os.writeBytes("exit\n"); 
      os.flush(); 
     } 
     BufferedReader stdInput = new BufferedReader(new 
      InputStreamReader(p.getInputStream())); 

     // read the output from the command 
     String s = null; 
     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 
    }catch(Exception e){ 
     Log.e(LOG_TAG, "RunAsRoot exec failed"); 
    } 

}

관련 문제