Выполнение команды монтирования в Java на Android - PullRequest
2 голосов
/ 31 января 2012

Я пытаюсь написать код Java, который выполняет некоторые команды терминала.Код должен выполнить эту команду sudo mount -o loop system.img system.Но есть несколько проблем.Во-первых, чтобы выполнить эту команду, я должен быть root.Я знаю, что могу быть sudo su, но как я могу остаться как root, когда закрываю окно терминала?Если я использую команду sudo mount -o loop system.img system, как я могу предоставить пароль в коде Java?

Вторая проблема: могу ли я выполнить команду, как показано ниже?

File f2 = new File("/home/user1/Desktop/aDirectory");
String[] commands = new String[]{"sudo mount", "-o", "loop", "/home/user1/Desktop/aDirectory/system.img"};

Runtime.getRuntime().exec(commands, null, f2);  

Я думаю, что не могу.Так как я могу это сделать?Есть идеи?

Примечания: system.img - это скомпилированный Android os файл.и system - это пустой каталог.Я пытаюсь монтировать файл system.img в каталог system.

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Проблема была решена с помощью сценария оболочки.

Я написал скрипт, включающий только эту строку:

echo myPassword | sudo -S mount -o loop system.img system

, затем я запускаю его в своем коде Java, например:

Runtime.getRuntime().exec("sh 1.sh");
1 голос
/ 31 января 2012

Такие программы, как sudo, читают пароль напрямую с оконечного устройства, а не с stdin, так что, к сожалению, это не тривиальная вещь. Я не уверен, реалистично ли это для Android или нет, но в обычной системе UNIX самое простое решение - использовать expect, которая является библиотекой для симуляции терминала и, тем самым, автоматизации этих видов взаимодействия. Он часто используется как отдельная программа, встроенная в Tcl, и я собрал вместе системы, в которых Java запустила expect, чтобы общаться с такими инструментами, как sudo, и она отлично работает.

expect включает в себя своего рода декларативный язык сценариев, который говорит ему, как запустить другую программу и как реагировать на вывод этой программы.

Что вы могли бы сделать, это использовать Runtime.exec() для запуска программы expect, предоставляя скрипт, который просто запускает "sudo mount", отслеживает запрос пароля и предоставляет пароль. Сценарий, вероятно, будет выглядеть примерно так ( G4rb4geB4rg3 - пароль):

spawn sudo mount -o loop /home/user1/Desktop/aDirectory/system.img
expect "password:"
send "G4rb4geB4rg3\r"
expect eof
0 голосов
/ 01 февраля 2012

Я почти уверен, что sudo и mount будут разделены, так как вы вызываете не один исполняемый файл.Кроме того, если вы запускаете sudo с ключом командной строки -S, он может получить пароль непосредственно из stdin, поэтому вам просто нужно запустить процесс и передать любой пароль, настроенный для входного потока.

...