我目前正在编写一个java程序,可以自动完成Android应用程序的日常工作。该程序的主要任务是通过Windows命令行运行多个外部工具,只要我不必与被调用的cmdline工具交互,它就可以正常工作。我在使用''keytool''创建密钥库时遇到问题。在执行''keytool''期间,命令行会提示我输入我的姓名,密码等。是否可以从文件中读取此信息?我不知道它是否有帮助,但这是处理命令执行的类。
private static void executeCmd(String command, PrintStream output) throws IOException, InterruptedException {
final Runtime r = Runtime.getRuntime();
final Process p = r.exec(command);
java.util.List<StreamWriter> reader = Arrays.asList(
new StreamWriter(p.getInputStream(), output).startAndGet(),
new StreamWriter(p.getErrorStream(), output).startAndGet()
);
if (output != null)
output.println("waiting for: " + command);
p.waitFor();
reader.forEach(StreamWriter::joinSilent);
if (output != null)
output.println("waiting done");
}
答案 0 :(得分:1)
检查keytool -help。您可以在keytool参数中传递别名和密码。例如
keytool -list -alias TEST -keystore "C:\java\jdk\jre\lib\security\cacerts" -storepass changeit
查看oracle的链接以获取更多示例
答案 1 :(得分:0)
您可以为命令准备输入文件并将其传递给标准输入。可以使用ProcessBuilder代替Runtime.exec
:
final Process process = new ProcessBuilder(command)
.redirectInput(new File(standardInputFileName))
.start();
但实际上,您不需要输入重定向来使用keytool
。您可以将所有必需的信息作为命令行参数传递。例如,以下是生成新RSA密钥的命令行(为清晰起见,将其分为行):
keytool -genkeypair
-keystore "<key store file>"
-alias "<key alias>"
-keyalg "RSA"
-keypass "<key password>"
-storepass "<store password>"
-dname "<distingushed name>"
其中专有名称具有表格(为清晰起见,再次将其拆分为行)
CN=<common name>,
OU=<orgamization unit>,
O=<organization>,
L=<location>,
ST=<state>,
C=<two-letter country code>
在没有用户交互的情况下生成新密钥的工作示例:
keytool -genkeypair -keystore my.store -alias my.key -keyalg RSA -storepass storage-pass -keypass key-pass -dname "CN=Nobody, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=US"
有关详情,请参阅keytool documentation page。