【问题标题】:Passing java input into external application将java输入传递给外部应用程序
【发布时间】:2017-01-19 20:37:20
【问题描述】:

我正在尝试从 java 文件中执行外部程序 (.exe)。 到目前为止,这是我的代码:

try{
                Process process = new ProcessBuilder(path).start();
                InputStream is = process.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line;




                while ((line = br.readLine()) != null) {
                  System.out.println(line);
                }

                }
                catch(Exception e){e.printStackTrace();}

程序的初始输出显示在我的 java 程序的控制台窗口上,但不幸的是,它需要用户密码并按 Enter。我已经尝试实现我在互联网上找到的许多可能的解决方案,例如 .inheritIO() 或在 process-arguments 中转发命令,即 Process process = new ProcessBuilder(path,"pw","/c").start() ;但这不起作用。我不明白为什么输入流工作得很好,但任何类型的输出流似乎都不起作用。

【问题讨论】:

  • 嗯,你没有提到试图打开进程的输出流(实际上它是它的输入流,从 Java 的角度来看它是一个输出流)。你试过吗?再说一遍,请记住,许多程序对密码有特殊的交互,不涉及流,而是直接读取密钥或直接访问设备。
  • 我不确定,但我认为外部程序是用 java 或 c/c++ 编写的。这对我的 java 代码至关重要吗?
  • 如果inheritIO() 不起作用,您可以停止。 inheritIO() 已经提供直接连接。如果这不起作用,则子进程根本不使用该通道,而是直接访问控制台——以一种在子进程时显然停止工作的方式。请注意,当您的应用程序从 IDE 启动时,本机控制台上的某些功能将无法正常工作。

标签: java stream processbuilder


【解决方案1】:

你可以按照这个食谱:

  1. 暂时不考虑 Java:看看您是否可以找到一种方法来使用 cmd/shell 调用该工具,并为其提供密码作为命令行参数(意思是:在不增加另一层复杂性的情况下进行此类实验)。如果可行,只需将这些参数放入您的 Java 程序中即可在其中使用它们。
  2. 如果这不起作用,您必须考虑是否可以将密码“写入”进程; there 有很多例子可以做到这一点。
  3. 如果这也不起作用,那么很可能您的 .exe 没有使用标准输入读取密码。在这种情况下,您唯一能做的就是:更改 .exe 的工作方式。示例:如果您的 .exe 实际上正在另一个系统上执行一些“远程操作”(您需要密码);然后您可以尝试建立无密码通信;基于私钥/公钥对。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 2020-11-14
    • 2020-03-15
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多