在Java中,将命令发送到另一个命令行程序

我在Windows XP上使用Java,并希望能够将命令发送到另一个程序,如telnet。 我不想简单地执行另一个程序。 我想执行它,然后在它运行时发送一系列命令。 这是我想要做的代码,但它不起作用:(如果取消注释并将命令更改为“cmd”,它将按预期工作。请帮助。)这是一个简化的示例。 在生产中会发送更多的命令,所以请不要建议调用“telnet localhost”。

try { Runtime rt = Runtime.getRuntime(); String command = "telnet"; //command = "cmd"; Process pr = rt.exec(command); BufferedReader processOutput = new BufferedReader(new InputStreamReader(pr.getInputStream())); BufferedWriter processInput = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream())); String commandToSend = "open localhost\n"; //commandToSend = "dir\n" + "exit\n"; processInput.write(commandToSend); processInput.flush(); int lineCounter = 0; while(true) { String line = processOutput.readLine(); if(line == null) break; System.out.println(++lineCounter + ": " + line); } processInput.close(); processOutput.close(); pr.waitFor(); } catch(Exception x) { x.printStackTrace(); } 

这看起来没问题,因为它不会产生那么多的输出,但是你应该在单独的线程中进行读写,这样它就不会填满缓冲区并在你到达下一步之前阻止你等待阅读。

因此,如果它达到了您发送给它的命令的点,请确定Windows telnet客户端是否支持从标准输入而不是控制台接收命令,方法是通过在命令中将您要发送的文本传递给它的标准输入提示。

例如, echo dir c:\ | cmd echo dir c:\ | cmd导致cmd运行,列出c:驱动器内容并退出,就像在控制台中键入dir c:\ 。 但是echo open localhost | telnet echo open localhost | telnet导致telnet清除屏幕然后退出,而不是像在控制台中键入它一样。 由于telnet需要屏蔽密码的用户输入,因此它很可能是使用控制台API而不是读取标准输入。 它的帮助没有列出任何命令参数来告诉它从标准输入读取,所以也许你需要使用更适合脚本的telnet实现。

这不是你问题的直接答案,而是……

您应该使用ProcessBuilder并将stderr重定向到stdoutProcessBuilder.redirectErrorStream(true) ),而不是使用Runtime.exec() )。 否则,如果将某些内容写入stderr您的进程可能会阻塞(当不读取进程的输出时,Windows不喜欢它)。

如果要以编程方式从Java控制telnet会话,您可以使用此Java telnet库 …您可以执行相同的操作(打开连接,发送用户名/密码,发送命令和接收结果)但不实际生成一个单独的过程。

您可以查看Telnet Ant任务,您可以直接在代码中调用它,而不必使用build.xml文件。

您还可以查看源代码并了解它们是如何进行的。