Java 默认情况下,以超级用户身份执行linux命令

Java 默认情况下,以超级用户身份执行linux命令,java,android,linux,rooted-device,Java,Android,Linux,Rooted Device,我正在开发一款有根的Android设备。 有没有一种方法可以让linux命令以超级用户的身份执行,而无需调用 Runtime.getRuntime().exec("su") 每次?让我烦恼的是,每次都会出现祝酒词,说该应用程序已被授予超级用户权限。第一次发出su命令时,会出现一个对话框,即使我选择在每次执行命令时记住该选项,我也会得到Toast。不,使用提供的默认su二进制文件时没有办法。chainxx和chainfire的SU应用程序都有不弹出窗口的选项,但这是用户的选择 当然,您可以编译自

我正在开发一款有根的Android设备。 有没有一种方法可以让linux命令以超级用户的身份执行,而无需调用

Runtime.getRuntime().exec("su")

每次?让我烦恼的是,每次都会出现祝酒词,说该应用程序已被授予超级用户权限。第一次发出su命令时,会出现一个对话框,即使我选择在每次执行命令时记住该选项,我也会得到Toast。

不,使用提供的默认su二进制文件时没有办法。chainxx和chainfire的SU应用程序都有不弹出窗口的选项,但这是用户的选择


当然,您可以编译自己的su二进制文件并使用它,它是开源的。这可能会导致安全问题,因为有一个开放的su二进制文件,用户可能不会喜欢这样。如果您这样做了,您将想做一些事情,比如其他su二进制文件如何在其中运行,它将检查您的应用程序是否正在执行调用(如果没有拒绝操作)。但同样,这可能不是您应该做的。

不,在使用提供的默认su二进制文件时,没有办法。chainxx和chainfire的SU应用程序都有不弹出窗口的选项,但这是用户的选择


当然,您可以编译自己的su二进制文件并使用它,它是开源的。这可能会导致安全问题,因为有一个开放的su二进制文件,用户可能不会喜欢这样。如果您这样做了,您将想做一些事情,比如其他su二进制文件如何在其中运行,它将检查您的应用程序是否正在执行调用(如果没有拒绝操作)。但同样,这可能不是你应该做的事情。

不确定你想要执行什么和频率。但是您可以在OutputStream中执行多个命令,因此您可以在数组或类似的东西中对命令进行排队

public void runCommandsAsRoot(String[] cmds) throws IOException {
    Process proc = Runtime.getRuntime().exec("su");

    DataOutputStream oStream = new DataOutputStream(proc.getOutputStream());

    for (String cmd : cmds) {
        oStream.writeBytes(cmd + "\n");
    }

    oStream.writeBytes("exit\n");  
    oStream.flush();
}
然后像这样调用它:

String[] commands = { "fistCommand", "secondCommand" };
runCommandsAsRoot(commands);

不确定要执行的内容和频率。但是您可以在OutputStream中执行多个命令,因此您可以在数组或类似的东西中对命令进行排队

public void runCommandsAsRoot(String[] cmds) throws IOException {
    Process proc = Runtime.getRuntime().exec("su");

    DataOutputStream oStream = new DataOutputStream(proc.getOutputStream());

    for (String cmd : cmds) {
        oStream.writeBytes(cmd + "\n");
    }

    oStream.writeBytes("exit\n");  
    oStream.flush();
}
然后像这样调用它:

String[] commands = { "fistCommand", "secondCommand" };
runCommandsAsRoot(commands);

我还没有在Android上玩过
su
,但是在普通Linux系统上使用它时,在调用
su
一次之后,您将作为超级用户登录(终端)会话的其余部分。因此,每次执行应用程序时,您很可能只需要调用一次
su
。我没有在Android上玩过
su
,但在普通Linux系统上使用它时,在调用
su
一次之后,您将作为超级用户登录(终端)会话的其余部分。因此,对于每个应用程序的执行,您很可能只需要调用
su
一次。是的,谢谢,这可能很有用。我的用例要求我始终保持该进程运行,并每隔几个小时执行几个命令。所以我的想法是在手机启动时打开proc,这样用户只会看到一次Toast,并在需要时保持打开状态并执行命令。你能想到这种方法的缺点吗?你需要考虑当你的应用程序被挂起或Android内存不足并从你的应用程序中回收一些内存时,这个过程会发生什么。也就是说,不要试图在进程为空时访问它,以避免出现异常。不确定进程是否容易泄漏内存,但只有一种方法可以找到。是的,谢谢,这可能很有用。我的用例要求我始终保持该进程运行,并每隔几个小时执行几个命令。所以我的想法是在手机启动时打开proc,这样用户只会看到一次Toast,并在需要时保持打开状态并执行命令。你能想到这种方法的缺点吗?你需要考虑当你的应用程序被挂起或Android内存不足并从你的应用程序中回收一些内存时,这个过程会发生什么。也就是说,不要试图在进程为空时访问它,以避免出现异常。不确定进程是否容易泄漏内存,但只有一种方法可以找到。谢谢,我也得出了类似的结论。我下载了一个名为Super SU的应用程序,它有你提到的选项,在我禁用Toast后,我的应用程序没有导致Toast出现。所以你认为这些应用程序已经编译了自己的su二进制文件,以便能够做到这一点?我当然不想这么做,因为这可能是一项复杂的任务,也是我应用程序关注的焦点之外的一条路:)谢谢,我也得出了类似的结论。我下载了一个名为Super SU的应用程序,它有你提到的选项,在我禁用Toast后,我的应用程序没有导致Toast出现。所以你认为这些应用程序已经编译了自己的su二进制文件,以便能够做到这一点?我当然不想这么做,因为这可能是一项复杂的任务,也不是我应用程序的重点:)