我目前正在开发一个项目,客户端从服务器接收shell / console命令,并且必须执行它们。
如何让Java在shell或命令提示符下运行这些命令?我希望能够忽略平台类型 - 而不必指定shell或命令提示符 - 但如果我不能,那就没关系。
我必须能够发送相关命令的序列,而不仅仅是一个命令。这意味着shell /提示符不能在命令之间退出或关闭。
我当前的代码,如下所示,允许执行一系列程序,但这些命令必须以某种方式通过管道输入shell /命令提示符,必须从中读取输出。
ArrayList<String> comDat = new ArrayList<>();
while(true) {
String input = con.recv();
System.out.println("> " + input);
if(!input.equals("EOF")) comDat.add(input); else {
String[] s = new String[comDat.size()];
for(int i = 0; i < comDat.size(); i++) s[i] = comDat.get(i);
System.out.println("---Command sequence executing---");
Process p = Runtime.getRuntime().exec(s);
p.waitFor();
System.out.println("---ErrorStream output---"); String line = "";
BufferedReader errStream = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while((line = errStream.readLine()) != null) System.out.println("< " + line);
System.out.println("\n---OutputStream output---"); line = "";
BufferedReader outStream = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line = errStream.readLine()) != null) System.out.println("< " + line);
}
Thread.sleep(200);
}
感谢您的帮助!
答案 0 :(得分:0)
围绕dir
不是外部命令但是cmd
的功能的基本前提进行了回顾。
在读取进程的输出时我会避免BufferedReaders
因为并非所有进程在发送输出时都使用新行(例如进度指示符),而是应该读取char for char(IMHO)。
您应该{@ 1}}而不是ProcessBuilder
。它提供了更好的管理,允许您将错误流重定向到输入流,从而更容易读取输入。
Runtime#exec