Полное управление терминалом на Android - PullRequest
0 голосов
/ 18 января 2019

Я пытался запустить несколько команд Linux на моем телефоне Android с

Process process = Runtime.getRuntime().exec(COMMAND);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));

И заметил, что я могу запускать только определенные команды и получать правильный вывод, даже если устройство имеет рут-доступ с SuperSU (я также тестировал его с устройством без SuperSU).

Например, если я запускаю ls и пытаюсь поместить его на экран (через TextView) следующим образом:

public void onBtnClick(View view) {
    try {
        EditText commandLine = findViewById(R.id.commandText);
        Process process = Runtime.getRuntime().exec(commandLine.getText().toString());
        BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        ((TextView) findViewById(R.id.mainTextView)).setText(((TextView) findViewById(R.id.mainTextView)).getText() + "\n" + in.readLine());
        commandLine.setText("");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

вывод acct, что имеет смысл.

Но с другой стороны, если я скажу, что я запускаю pwd, это выдаст мне следующую ошибку:

W / System.err: java.io.IOException: Ошибка при запуске exec (). Команда: [pwd] Рабочий каталог: null Среда: null

Я провел некоторое онлайн-исследование и наткнулся на Termux , который может иметь полный контроль над телефоном через терминал, и это именно то, что я хочу сделать (для моих собственных целей обучения и тестирования).

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

Я здесь для того, чтобы повторить то, что Termux делает для себя, чтобы я мог правильно запускать команды Linux из Java-кода приложения, не требуя от пользователя фактически вводить команды.

Может ли кто-нибудь помочь мне с тем, с чего начать и как правильно выполнять эти команды на моем устройстве?

1 Ответ

0 голосов
/ 19 января 2019

Termux заявляет, что он не работает как традиционный Linux bash, так как он устанавливает свою собственную среду виртуального выхода при первой настройке в своем каталоге данных в /data/data/com.termux/files/usr, см. здесь и здесь Кроме того, согласно официальным документам для Android , метод exec(command),

Выполняет указанную строковую команду вотдельный процесс.

Это удобный метод.Вызов формы exec (command) ведет себя точно так же, как и вызов exec (command, null, null).

Так что, если это отдельный процесс, при выполнении команды он будетзапустите его в каталоге этого процесса (каждый процесс в Linux получает свой каталог и получает PID, который используется os).Так что команда ls дает вам просто то, что находится внутри каталога этого процесса.Вы должны быть где-то вроде /proc/31415/ и есть только файл acct (cgroup в обычном Linux).

Что вам нужно сделать, это запустить команду внутри каталога, объявив ее при вызове getRuntime ().exec () см. ссылку выше, чтобы найти нужный вам.Я бы предложил использовать переопределение, которое обрабатывает все параметры.Вам понадобится что-то вроде этого:

String[] cmd = {"mkdir", "testDir"};
File env =  new File(getFilesDir().getAbsolutePath());
Runtime.getRuntime().exec(cmd, null, env);

Кроме того, не помешает взглянуть на установочный код Termux (exec (). Это даст вам хорошийне обращайте внимания на настройку среды и работу с основными командами.

Кроме того, я думаю, что вы уже сделали это, но дважды проверьте, чтобы убедиться, что вы запрашиваете разрешение WRITE_EXTERNAL_STORAGE для своего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...