在 Android 应用程序中执行 shell 脚本不显示结果

Posted

技术标签:

【中文标题】在 Android 应用程序中执行 shell 脚本不显示结果【英文标题】:Executing shell script in Android app doesn't show results 【发布时间】:2011-12-08 13:41:35 【问题描述】:

我无法弄清楚我的代码发生了什么。我正在尝试创建个人资料应用程序。该设备已植根并包含 BusyBox。我编写了一个 linux 脚本,根据登录的用户交换 /data 和 /cache 分区。

当我从 ADB 执行此脚本时,它运行良好。我认为在应用程序中实现它会相当容易。

#sp登录用户名密码

android 使用新配置文件重新初始化,一切正常。这就是我在 Android 中所拥有的:

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 中运行时,所有挂载命令和我正在做的不同事情都有输出。这些都没有在输出字符串中输出。

有什么建议吗?

【问题讨论】:

如果password 包含诸如;&*? 等shell 元字符,您的exec() 调用可能无法按预期执行。如果 Android 允许您访问更像 execve(2) 而不太像 system(3) 的东西,那么使用它是明智的。 (虽然我认为这与您当前的问题无关。) 不。密码中没有特殊字符。只是一个简单的字符串,虽然这是我需要检查的东西。此外,Android 似乎没有 execve,尽管我对此不太了解。 【参考方案1】:

您需要为该进程执行“su”,它将执行您的 shell 脚本。

否则,即使设备已经root,这个进程也没有root权限。

下面的代码是一个示例供您参考。

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");
    

【讨论】:

以上是关于在 Android 应用程序中执行 shell 脚本不显示结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在android程序中执行adb shell命令

如何以编程方式在android中使用blktrace命令执行shell脚本?

Android列表视图将内容包装到基于页脚大小的特定大小

在 Android 应用程序中执行 shell 脚本不显示结果

从android执行shell命令

如何在android程序中执行adb shell命令