以编程方式从java在终端中执行命令
我需要使用java在终端中执行命令。我非常喜欢通过java代码编程访问mac的终端窗口。如果你能提供有价值的解决方案来完成我过去两天一直在努力完成的任务,那将非常有用。我也张贴了一段代码,我正试图做为您的参考。任何形式的帮助都会对我有帮助以编程方式从java在终端中执行命令,java,linux,macos,bash,terminal,Java,Linux,Macos,Bash,Terminal,我需要使用java在终端中执行命令。我非常喜欢通过java代码编程访问mac的终端窗口。如果你能提供有价值的解决方案来完成我过去两天一直在努力完成的任务,那将非常有用。我也张贴了一段代码,我正试图做为您的参考。任何形式的帮助都会对我有帮助 public class TerminalScript { public static void main(String args[]){ try { Process proc = Runtime.getRun
public class TerminalScript
{
public static void main(String args[]){
try {
Process proc = Runtime.getRuntime().exec("/Users/xxxx/Desktop/NewFolder/keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -validity 10000");
BufferedReader read = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
try {
proc.waitFor();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
while (read.ready()) {
System.out.println(read.readLine());
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
注意:我必须通过java程序在终端中运行命令
keytool-genkey-v-keystore test.keystore-alias test-keyalg RSA-sigalg SHA1withRSA-keysize 2048-validity 10000
。您的代码有许多问题:
将其提示发送到keytool
,而不是stderr
,因此您需要调用stdout
proc.getErrorStream()
- 您不希望缓冲来自
的输出,因为您需要查看提示keytool
- 您不想等待
终止keytool
- 由于
是交互式的,因此需要对流程进行读写操作。最好生成单独的线程来分别处理输入和输出keytool
Process proc = Runtime.getRuntime().exec("/usr/bin/keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -validity 10000");
InputStream read = proc.getErrorStream();
while (true) {
System.out.print((char)read.read());
}
您能告诉我您的问题是什么吗?进程可能正在等待您读取其输出,而您正在等待它退出。这是一个死锁。
keytool
是java内部密钥管理API的cli接口。您是否可以直接使用这些API,因为您已经在编写java代码了?您没有领会我的意思keytool
是一个命令行工具,据我所知,它只使用java key/keystore/etc.API。因此,您应该能够直接使用本机API,因为您已经在编写/运行java代码。(你的帖子中的命令只是生成一个密钥,而不是对任何内容进行签名。)扩展Etan的观点:keytool所做的一切都可以通过类的方法来完成。使用外部进程来完成代码同样可以完成的事情不是一个好的做法。此外,您使用的ready()
也不正确;该方法不指示数据的结束,只指示下一次读取是否会阻塞。