我正在尝试编写执行某些终端命令的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
目录中。
答案 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获取密码,因此您只需启动该过程并传入任何密码配置为输入流。