2015-12-29 101 views
0

我有要求在终端中使用java执行命令。我真的坚持以编程方式通过java代码访问mac的终端窗口。如果您提供有价值的解决方案来执行我过去两天一直在努力完成的任务,这将非常有用。我也发布了一段代码,我正在尝试做的参考。任何形式的帮助将是对我以编程方式在java中执行终端中的命令

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

+0

你能告诉你有什么问题吗? –

+0

当您等待它退出时,该进程可能正在等待您读取其输出。这是一个僵局。 –

+0

'keytool'是我相信java内部密钥管理API的cli接口。您可以直接使用这些API,因为您已经在编写Java代码了吗? –

回答

1

有许多与你的代码的问题:

  • keytool将其提示stderr,不stdout,所以你需要调用proc.getErrorStream()
  • 你不想从keytool缓冲输出因为你需要看到提示
  • 你不想等到keytool终止
  • 由于keytool是交互式的,y你需要读取和写入过程。产生单独的线程来分别处理输入和输出可能会更好。

下面的代码解决了前三个点作为一个概念证明并显示从keytool的第一个提示,但作为@伊坦 - 赖斯纳说,你可能要使用本机API来代替。

 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()); 
     }