在 Android 上通过 java 代码运行 Shell 命令?

Posted

技术标签:

【中文标题】在 Android 上通过 java 代码运行 Shell 命令?【英文标题】:Running Shell commands though java code on Android? 【发布时间】:2011-10-16 11:17:53 【问题描述】:

我有一个应用程序,它应该使用一些 shell 命令将文件从 sdcard 复制到 /system/media/。它需要root,我正在root设备上进行测试。我正在使用运行时来执行 shell 命令,但它不起作用。 这是我为我的运行时准备的东西

public void RunAsRootString[] commands = "sysrw", "rm /data/local/bootanimation.zip", "sysro";
    Process p = Runtime.getRuntime().exec("su");
    DataOutputStream os = new DataOutputStream(p.getOutputStream());            
    for (String tmpCmd : commands) 
    os.writeBytes(tmpCmd+"\n");
               
    os.writeBytes("exit\n");  
    os.flush();

但我的 logcat 只显示其中两个没有被拒绝

07-30 03:14:11.112: WARN/su(3593): request rejected (10047->0 /system/bin/sh)
07-30 03:14:11.132: DEBUG/su(3592): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh
07-30 03:14:11.152: WARN/su(3594): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.182: WARN/su(3595): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.202: WARN/su(3596): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.242: DEBUG/su(3597): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh

这两个看起来是 sysrw 和 sysro 命令,但当我触发此代码时,应用程序仍然要求 root 权限。 我不熟悉使用 root 的东西,我似乎不知道如何让它工作。

【问题讨论】:

我可以得到这个示例的工作项目吗? 这对我不起作用,我没有收到任何 FileNotFound 异常或 Java 中的任何内容。另外,SuperSU 拦截了根请求,我可以授予它,所以我知道getRuntime() 正在工作。出于某种原因,它不允许我操作 /system/media 文件夹中的文件。 啊,sysrw 和 sysro 好像是未知命令。 抱歉这个幼稚的问题:这只适用于有根设备,不是吗? 【参考方案1】:

要运行 root 命令,您必须使用以下格式:

    public void RunAsRoot(String[] cmds)
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());            
            for (String tmpCmd : cmds) 
                    os.writeBytes(tmpCmd+"\n");
                       
            os.writeBytes("exit\n");  
            os.flush();

你传入一个字符串数组,每个字符串都是一个需要执行的命令。例如:

String[] commands = "sysrw", "rm /data/local/bootanimation.zip", "sysro";

【讨论】:

当我把它放在我的 onClick 中时,它说 () 的周围 (String[] cmds) 应该是;的,当我这样做时只会增加更多的错误。 我刚刚编辑了我的原始答案以显示需要传入的字符串数组的示例 我想知道的一件事是为什么输入是通过outputstream 并通过inputstream 输出,命名问题? 是否可以获得我刚刚执行的命令的输出..?例如“ls /数据” 以上代码似乎不适用于非根设备

以上是关于在 Android 上通过 java 代码运行 Shell 命令?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Appium 在 Android 操作系统上运行 Selenium 测试

Android:从 Java 代码调用 Python 脚本(通过 SL4A)

让 Dbus 的 Java 绑定在 Android 上运行

使用 Android 模拟器运行 Flutter 代码时出现 JAVA_HOME 错误

android -------- java虚拟机和Dalvik虚拟机

eclipse如何编译java源程序