Показать процессы сценария оболочки - PullRequest
0 голосов
/ 16 мая 2011

У меня есть следующий метод для запуска команд оболочки в моих Java-приложениях, и я хочу запустить несколько сценариев, таких как сценарий, который фиксирует разрешения для всех приложений на телефоне пользователя.Я могу без проблем запустить скрипт с помощью этой команды execCommand ("/ system / xbin / fix_perm");однако проблема в том, что я хочу просто распечатать то, что делается, как эмулятор терминала, как я могу взять свой выходной поток и распечатать его на экране?Спасибо за любую помощь

public Boolean execCommand(String command) 
{
    try {
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
        os.writeBytes(command + "\n");
        os.flush();
        os.writeBytes("exit\n");
        os.flush();
        process.waitFor();
    } catch (IOException e) {
        return false;
    } catch (InterruptedException e) {
        return false;
    }
    return true;
}

1 Ответ

0 голосов
/ 16 мая 2011

Я надеюсь, что вы знаете о потенциально экстремальных последствиях, которые дает пользователю возможность запускать произвольные команды как su и вместо этого указывают на возможное решение.

public Boolean execCommand(String command) 
{
    try {
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("su");

        // capture stdout
        BufferedReader stdout = new BufferedReader(
            new InputStreamReader(process.getInputStream()));
        // capture stderr
        BufferedReader stderr = new BufferedReader(
            new InputStreamReader(process.getErrorStream()));

        DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
        os.writeBytes(command + "\n");
        os.flush();

        String line = null;
        StringBuilder cmdOut = new StringBuilder();
        while ((line = stdout.readLine()) != null) {
            cmdOut.append(line);
        }
        stdout.close();
        while ((line = stderr.readLine()) != null) {
            cmdOut.append("[ERROR] ").append(line);
        }
        stderr.close();

        // Show simple dialog
        Toast.makeText(getApplicationContext(), cmdOut.toString(), Toast.LENGTH_LONG).show();

        os.writeBytes("exit\n");
        os.flush();

        // consider dropping this, see http://kylecartmell.com/?p=9
        process.waitFor(); 
    } catch (IOException e) {
        return false;
    } catch (InterruptedException e) {
        return false;
    }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...