如何生成具有继承权限的进程

时间:2012-01-05 17:28:56

标签: java android runtime process

有没有办法让流程具有该流程的所有继承权限,我已经拥有。

例如我有一些过程;

Process superUserShell = Runtime.getRuntime().exec("su");

我可以获得输出流并执行这样的命令

DataOutputStream outputStream = new DataOutputStream(superUserShell.getOutputStream());
// for example 
outputStream.writeBytes("rm -rf /*");
outputStream.flush();

但是我没有处理已执行命令结果的可能性,所以我真正希望将另一个进程生成的进程分开(例如“superUserShell”)

有什么想法吗?


当然这不是出于恶意目的^ _ ^这只是我想到的第一件事。 实际上我正在研究fbgrab的小型包装器,用于安卓...

p = Runtime.getRuntime().exec("su");//lets assume my android os grants super user premissions. this is not the question!!!!
DataOutputStream outputStream = new DataOutputStream(p.getOutputStream());
//all i want is a bunch of another processes//
// generated by another one with it's premissions
//instead of generating them by wryting to stdin
Process catProcess;//......
Process someAnotherBinaryExecutionProcess;//......
outputStream.writeBytes("cat /dev/graphics/fb0 > "+ getFilesDir() + "/fb0\n");

outputStream.writeBytes("exit\n");

outputStream.flush();

p.waitFor();

3 个答案:

答案 0 :(得分:3)

首先,我希望这不是用于邪恶目的。你"rm -rf /*"的例子引起了我的一些担忧。

如果您执行Runtime.getRuntime().exec("bash"),您将获得一个shell,您可以发送命令并从中获取响应。因此,例如,您可以将控制台绑定到其中:

final Process process = Runtime.getRuntime().exec("bash");

new Thread() {
    public void run() {
        try {
            InputStreamReader reader = new InputStreamReader(process.getInputStream());
            for(int c = reader.read(); c != -1; c = reader.read()) {
                System.out.print((char)c);
            }
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}.start();

// (Same for redirecting the process's error stream to System.err if you want)

InputStreamReader fromKeyboard = new InputStreamReader(System.in);
OutputStreamWriter toProcess = new OutputStreamWriter(process.getOutputStream());

for(int c = fromKeyboard.read(); c != -1; c = fromKeyboard.read()) {
    toProcess.write((char)c);
    toProcess.flush();
}

这是一种很好的实验方法,可以看看您的操作系统会让您做什么。在Mac OS上,如果我想从这个过程sudo命令,我遇到的问题是它无法接受来自STDIN的密码,因为它实际上不是登录shell。所以,我必须这样做:

SUDO_ASKPASS="password.sh" sudo -A <command>

...其中“password.sh”只是回显我的密码,是我想以root身份运行的命令(我使用了很好的安全“pwd”而不是你的wipe-my-root-filesystem示例)。 / p>

答案 1 :(得分:0)

一些注意事项:

  1. 我想你已经通过Process.getInputStream()

    从这个过程得到了输出
    BufferedReader buf = new BufferedReader( new InputStreamReader(
            superUserShell.getInputStream() ) ) ;
    
    while ( ( String line ; line = buf.readLine() ) != null ) {
        // do domething with data from process;
    }
    
  2. 尝试在命令中添加换行符,例如"rm -rf /* \r\n"

  3. 如果您连续发送多个命令(并阅读回复),那么您可能希望在不同的线程中发送和接收数据。

答案 2 :(得分:-1)

Selvin是对的,su立即返回,并没有为你的应用程序提供类似真实的交互式shell的“shell”类型的情况。您要查看的内容类似于sudo <command>,以便让su运行您想要的命令。