在Android上用Java执行mount命令

时间:2012-01-31 11:48:17

标签: java terminal root sudo mount

我正在尝试编写执行某些终端命令的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 操作系统文件。并且system是一个空目录。我正在尝试做的是将system.img文件挂载到system目录中。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

通过使用shell脚本解决了问题。

我写了一个脚本,包括这一行:

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

然后我在我的java代码中运行它,例如:

Runtime.getRuntime().exec("sh 1.sh");

答案 2 :(得分:0)

我很确定'sudo'和'mount'是分开的,因为它不是你正在调用的单个可执行文件。此外,如果您使用-S命令行开关启动sudo,它可以直接从stdin获取密码,因此您只需启动该过程并传入任何密码配置为输入流。