我正在尝试编写执行某些终端命令的 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
目录中。
最佳答案
像 sudo
这样的程序直接从终端设备读取密码,而不是从 stdin
读取密码,所以不幸的是这不是一件小事。我不确定这是否适用于 Android,但在一般的 UNIX 系统上,最简单的解决方案是使用 expect
,这是一个用于模拟终端的库,从而使这些类型的交互自动化。它通常用作嵌入 Tcl
中的独立程序,我将 Java 启动 expect
的系统放在一起,以与 sudo
等工具对话,它工作正常。
expect
包含一种声明性脚本语言,告诉它如何运行另一个程序以及如何对该程序的输出使用react。
你要做的是使用 Runtime.exec()
来执行 expect
程序,提供一个脚本来运行“sudo mount
",注意密码提示,并提供密码。该脚本可能看起来像(G4rb4geB4rg3 是密码):
spawn sudo mount -o loop /home/user1/Desktop/aDirectory/system.img
expect "password:"
send "G4rb4geB4rg3\r"
expect eof
关于java - 在Android上用Java执行挂载命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9079006/