我正在尝试使用Java中的Runtime.getRuntime.exec()运行命令。
Runtime r = Runtime.getRuntime();
Process process = r.exec("telnet 172.16.221.87 ");
InputStream is = process.getInputStream();
OutputStream os = process.getOutputStream();
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(os));
br.write("ditech\r\n");
br.flush(); // The exception is coming on last line that is br.flush();
当我在Linux中运行代码时,它的工作正常。但是,当在Windows上运行相同的代码时,它会抛出以下错误:
java.io.IOException: The pipe is being closed
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at sun.nio.cs.StreamEncoder.implFlush(Unknown Source)
at sun.nio.cs.StreamEncoder.flush(Unknown Source)
at java.io.OutputStreamWriter.flush(Unknown Source)
at java.io.BufferedWriter.flush(Unknown Source)
at com.telnet.ConnectToTelnet.doTelnet(ConnectToTelnet.java:132)
at com.telnet.ConnectToTelnet.main(ConnectToTelnet.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
答案 0 :(得分:0)
您需要阅读流程的输出。几乎可以肯定的是,通过按下登录阶段,你已经忽略了一些东西。您需要启动两个单独的线程来阅读stdout
和stderr,
或使用Process
和ProcessBuilder
类,合并stderr
和stdout
,并使用单个线程。
让线程暂时打印输出。这将告诉你当前的问题究竟是什么。更一般地,您应该在编写用户名之前等待login:
提示,在写入密码之前等待password:
提示,等等,这将是您在此Telnet会话中要做的所有其他事情:如果你有任何意想不到的事情,你需要做出相应的反应。
只是盲目地在过程中铲除输出只会导致更多像这样的谜题。