Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以编程方式从java在终端中执行命令_Java_Linux_Macos_Bash_Terminal - Fatal编程技术网

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

以编程方式从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

我需要使用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

您的代码有许多问题:

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

您能告诉我您的问题是什么吗?进程可能正在等待您读取其输出,而您正在等待它退出。这是一个死锁。
keytool
是java内部密钥管理API的cli接口。您是否可以直接使用这些API,因为您已经在编写java代码了?您没有领会我的意思
keytool
是一个命令行工具,据我所知,它只使用java key/keystore/etc.API。因此,您应该能够直接使用本机API,因为您已经在编写/运行java代码。(你的帖子中的命令只是生成一个密钥,而不是对任何内容进行签名。)扩展Etan的观点:keytool所做的一切都可以通过类的方法来完成。使用外部进程来完成代码同样可以完成的事情不是一个好的做法。此外,您使用的
ready()
也不正确;该方法不指示数据的结束,只指示下一次读取是否会阻塞。