Java Process exec方法不允许将输入传递给命令

brccelvz  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(122)

我正在练习java.io的方法,所以我首先创建了一个脚本,该脚本提示用户输入密码,如果输入正确,则打印“correct”。然后,我编写了一个java程序,该程序执行脚本并输入密码。然后,它输出脚本的输出。

import java.lang.*;
import java.io.*;
public class tryIt{
        public static void main(String args[]){
                try{
                        Process apple = Runtime.getRuntime().exec("echo cd|./script");
                        BufferedReader appleRead = new BufferedReader(new InputStreamReader(apple.getInputStream()));
                        String temp = "";
                        String output = "";
                        while((temp = appleRead.readLine())!=null){
                                output += temp;
                        }
                        System.out.println(output);
                }
                catch(Exception e){}

        }
}

在这个特定的代码块中,我试图将字符串“cd”作为输入传递给命令“./script”。然而,当我在Linux中运行这个java程序时,echo语句后面的整行打印如下:
cd|./script
我试着在“cd”周围放置一些引号,并用反斜杠转义它们,但它们也会被打印出来:
"cd"|./script
当我在Linux终端中运行这个命令时,它按预期工作。我可以做些什么来使我的程序按预期工作?
更新:我修改了一些代码,按照建议使用ProcessBuilder而不是.exec():

import java.util.*;
import java.io.*;
public class tryIt{
    public static void main(String[] args){
        try{
          ProcessBuilder process = new ProcessBuilder();
          process.command(new String[]{"echo","cd","|./script"});
          process.directory(new File(System.getProperty("user.dir")));
          BufferedReader read = new BufferedReader(new InputStreamReader(process.start().getInputStream()));
          String hi = "";
          while((hi=read.readLine())!=null){
            System.out.println(hi);
          }
        }
        catch(Exception e){}
        System.out.println("done");
      }
    }

然而,同样的问题仍然存在。到目前为止,我无法使用ProcessBuilder管道Bash。有什么解决方法吗?

tct7dpnv

tct7dpnv1#

Java ProcessBuilder并不是通过bash运行,而是“直接”运行。因此|作为参数传递给echo,而不是bash
一种选择是实际运行bash(即第一个参数是/bin/bash而不是echo)并使用bash的-c参数。可能更好,只需通过ProcessBuilder运行script.sh,然后使用Process.OutputStream将输入(cd)直接从Java发送到脚本。

相关问题