发送telnet命令并使用Java读取响应

我在一个支持全国网络上许多不同站点的大型组织工作。 我们的供应商为我们在每个站点使用的硬件提供诊断工具。 可通过Telnet访问诊断和报告。

问题是我们想要同时监控所有站点,目前我们只能一次检查一个站点(通过telnet)。

我已经构建了一些将使用Runtime.exec(String)向每个IP地址发送ping命令的东西。 但现在我希望能够使用供应商的诊断和报告工具自动发送特定命令。 有关最佳方法的任何想法吗? 注意我们有一个混合系统 – 一些站点在防火墙后面,有些则没有。 一个完整的解决方案将是理想的,但我也将满足于部分解决方案。

它可以像获取Runtime.exec(String)返回的Process对象的输入和输出流一样简单,并将我的命令发送到输入并读取输出上的响应吗? 或者我应该连接到端口23(通常的telnet端口),然后表现为任何其他客户端 – 服务器系统。 还是别的什么完全不同?

我正在继续尝试,只是在这一点集思广益……

代码:(删除敏感信息)

 void exec(String ip) { Socket sock = null; BufferedReader br = null; PrintWriter pw = null; try { sock = new Socket(ip, 23); br = new BufferedReader(new InputStreamReader(sock.getInputStream())); pw = new PrintWriter(sock.getOutputStream()); this.read(br); System.out.println("Sending username"); pw.println("username"); this.read(br); // Always blocks here System.out.println("Sending password"); pw.println("password"); this.read(br); pw.close(); br.close(); sock.close(); } catch(IOException e) { e.printStackTrace(); } } void read(BufferedReader br) throws IOException { char[] ca = new char[1024]; int rc = br.read(ca); String s = new String(ca).trim(); Arrays.fill(ca, (char)0); System.out.println("RC=" + rc + ":" + s); //String s = br.readLine(); // //while(s != null) //{ // if(s.equalsIgnoreCase("username:")) // break; // // s = br.readLine(); // // System.out.println(s); //} 

你为什么不简单地使用Socket系统?

在端口23上打开所选服务器的套接字并从此处发送您自己的命令。


这是一个简单的例子:

 public class EchoClient { public static void main(String[] args) throws IOException { Socket pingSocket = null; PrintWriter out = null; BufferedReader in = null; try { pingSocket = new Socket("servername", 23); out = new PrintWriter(pingSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(pingSocket.getInputStream())); } catch (IOException e) { return; } out.println("ping"); System.out.println(in.readLine()); out.close(); in.close(); pingSocket.close(); } } 

资源:

  • oracle.com – 关于套接字的所有信息

在套接字级别执行此操作的问题是,当您只想执行一些telnet命令时,您突然需要成为协议专家。

我在de.mud.jta上面写了一个驱动程序,但它保持线程打开,我不知道在哪里,以及如何解决这些问题。 在我看来,除了协议级别的编码或旧的JTA之外,必须有更好的东西。

telnet 几乎是裸tcp。 你可以建立套接字连接,编写命令,读取响应。

well – telnet确实有一些可以与数据流混合的控制命令。 你可以编程忽略它们。 或者,要完全识别协议,请使用java telnet客户端软件包。

Expect是一种脚本化(非Java)的可能性。 这是一个较旧的工具,请参阅维基百科的优点和缺点。

尝试检查Netty Java Library。 他们有一套很好的Telnet,SSH和其他非常有用的网络库

https://netty.io