以编程方式从java执行终端命令

时间:2015-12-29 19:30:44

标签: java linux macos bash terminal

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

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

1 个答案:

答案 0 :(得分:2)

您的代码存在许多问题:

  • keytool将其提示发送至stderr,而不是stdout,因此您需要致电proc.getErrorStream()
  • 您不希望缓存keytool的输出,因为您需要查看提示
  • 您不想等待keytool终止
  • 由于keytool是交互式的,您需要读取和写入流程。生成单独的线程以分别处理输入和输出可能更好。

以下代码将前三个点作为概念证明,并将显示来自keytool的第一个提示,但正如@ etan-reisner所说,您可能希望使用本机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());
        }