Как генерировать процессы с унаследованными правами и разрешениями - PullRequest
2 голосов
/ 05 января 2012

Есть ли способ сделать процесс со всеми унаследованными правами процесса, которым я уже владею.

Например, у меня есть какой-то процесс;

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

и я могу получить поток вывода и выполнить команды, подобные этой

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

но у меня нет возможности обрабатывать результаты выполненных команд, поэтому я действительно хочу отделить процессы, сгенерированные другим процессом (например, "superUserShell")

Есть мысли?


конечно, это не для злых целей ^ _ ^ это просто первое, что я имею в виду. на самом деле я работаю над небольшим оберткой fbgrab для Android ...

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 ]

3 голосов
/ 05 января 2012

Прежде всего, я надеюсь, что это не используется в злых целях. Ваш пример "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, потому что на самом деле это не оболочка входа в систему. Итак, я должен сделать это:

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

... где «password.sh» просто повторяет мой пароль, и это команда, которую я хочу запустить от имени пользователя root (я использовал хороший безопасный «pwd» вместо вашего примера wipe-my-root-filesystem).

0 голосов
/ 05 января 2012

Селвин прав, su возвращается немедленно и не предоставляет вашему приложению ситуацию типа «оболочка», как в реальной интерактивной оболочке.То, что вы хотите посмотреть, это что-то вроде sudo <command>, чтобы заставить su выполнить нужную команду.

0 голосов
/ 05 января 2012

Несколько замечаний:

  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. Если вы отправляете несколько команд подряд (и читаете ответ), то вы можете отправлять и получать данные в отдельных потоках.

...