我正在练习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。有什么解决方法吗?
1条答案
按热度按时间tct7dpnv1#
Java
ProcessBuilder
并不是通过bash运行,而是“直接”运行。因此|
作为参数传递给echo
,而不是bash
。一种选择是实际运行
bash
(即第一个参数是/bin/bash
而不是echo
)并使用bash的-c
参数。可能更好,只需通过ProcessBuilder
运行script.sh
,然后使用Process.OutputStream将输入(cd
)直接从Java发送到脚本。