【问题标题】:How to generate processes with inherited rights and permissions如何生成具有继承权限的进程
【发布时间】:2012-01-05 17:28:56
【问题描述】:

有没有办法让一个进程拥有该进程的所有继承权,我已经拥有了。

例如我有一些流程;

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

并且我能够获取输出流并执行这样的命令

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

但我没有办法处理执行命令的结果,所以我真正想要的是分离由另一个进程生成的进程(例如由“superUserShell”)

有什么想法吗?


当然不是为了邪恶的目的^_^这只是我想到的第一件事。 实际上我正在为 android 开发 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();

【问题讨论】:

  • 你运行“su”然后Procces就完成了......使用man su

标签: java android runtime process


【解决方案1】:

首先,我希望这不会被用于邪恶目的。你"rm -rf /*" 的例子让我有些担心。

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

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示例)。

【讨论】:

    【解决方案2】:

    几点说明:

    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. 如果您连续发送多个命令(并读取回复),那么您可能希望在单独的线程中发送和接收数据。

    【讨论】:

    • 是的,这就是我现在所做的,但我想要的是处理从进程返回的值。
    • 这应该是正确的——原则上。请显示更多代码,以便我们检查。
    【解决方案3】:

    Selvin 说得对,su 立即返回,并且不会像真正的交互式 shell 那样为您的应用程序提供“shell”类型的情况。您要查看的内容类似于 sudo &lt;command&gt; 以让 su 运行您想要的命令。

    【讨论】:

    • man su 说:su - 使用替代用户和组 ID 运行 shell
    • 我认为你错了。 su 不会立即返回,我会发送 throght sdtin 命令,它们会一直执行,直到我通过“exit\n”
    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多