【问题标题】:Running an interactive shellscript using java使用 java 运行交互式 shellscript
【发布时间】:2026-02-06 20:15:01
【问题描述】:

我正在编写一个 javacode 来调用交互式 shellscript 并使用 process builder 来调用 shellscript。我知道要将参数传递给这个 shell 脚本,我必须使用它的输入流来检查它的输出,并且需要使用输出流将命令传递给它。我的问题是,我如何知道使用 Input Stream 提示输入值?

我的代码:

  ProcessBuilder pb2=new ProcessBuilder("/home/abhijeet/sample1.sh","--ip="+formobj.getUpFile().getFileName(),"--seqs="+seqs);

        script_exec = pb2.start();

                OutputStream in = script_exec.getOutputStream();

                InputStreamReader rd=new InputStreamReader(script_exec.getInputStream());   

                pb2.redirectError();

                BufferedReader reader1 =new BufferedReader(new InputStreamReader(script_exec.getInputStream()));

                StringBuffer out=new StringBuffer();

                String output_line = "";    

                  while ((output_line = reader1.readLine())!= null) 
                  {
                           out=out.append(output_line+"/n");
                           System.out.println("val of output_line"+output_line);

                           //---> i need code here to check that whether script is prompting for taking input ,so i can pass it values using output stream

                  }

有没有办法直接知道脚本正在等待用户输入?

【问题讨论】:

    标签: java shell


    【解决方案1】:

    读取进程输出流并检查输入提示,如果知道输入提示,则将值放入进程输入流。 否则你没办法检查。

    ProcessBuilder pb = new ProcessBuilder(command);
    pb.redirectErrorStream(true);
    BufferedReader b1 = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedWriter w1 = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
    String line = "";
    String outp = "";
    while ((line = b1.readLine()) != null) {
      if (line.equals("PLEASE INPUT THE VALUE:")) {
         // output to stream
         w1.write("42");
      }
      outp += line + "\n";
    }
    
    ...
    

    UPD:对于您的代码,它应该是这样的

        ProcessBuilder pb2=new ProcessBuilder("/home/ahijeet/sample1.sh","--ip="+formobj.getUpFile().getFileName(),"--seqs="+seqs);
    
        script_exec = pb2.start();
    
                OutputStream in = script_exec.getOutputStream();
    
                InputStreamReader rd=new InputStreamReader(script_exec.getInputStream());   
    
                pb2.redirectError();
    
                BufferedReader reader1 =new BufferedReader(new InputStreamReader(script_exec.getInputStream()));
    
                StringBuffer out=new StringBuffer();
    
                String output_line = "";    
    
                  while ((output_line = reader1.readLine())!= null) 
                  {
                           out=out.append(output_line+"/n");
                           System.out.println("val of output_line"+output_line);
    
                           //---> i need code here to check that whether script is prompting for taking input ,so i can pass it values using output stream
                           if (output_line.equals("PLEASE INPUT THE VALUE:")) {
                               // output to stream
                               in.write("42");
                           }
    
                  }
    

    【讨论】:

    • 我的问题是一样的,我将如何检查输入提示?然后我可以使用 outputstream 设置值。
    • 您是逐行阅读过程输出流的,是吗?当您阅读下一行时,您必须检查此行的键输入序列
    • 我已经添加了代码,你能告诉我建议的代码行吗?
    • 我想到了这个解决方案。但是我想知道这一点,因为我知道有没有直接的方法可以知道脚本需要用户输入?
    • 我认为一般情况下没有办法检查这一点