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

使用Java发送telnet命令并读取响应,java,Java,我在一家大型组织工作,该组织支持全国网络上的许多不同站点。我们的供应商为我们在每个站点使用的硬件提供诊断工具。诊断和报告通过Telnet访问 问题是我们想同时监控所有的站点,目前我们一次只能检查一个站点(通过telnet) 我已经构建了一些东西,它将使用Runtime.exec(String)向每个IP地址发送ping命令。但现在我希望能够使用供应商的诊断和报告工具自动发送特定命令。有什么好办法吗?请注意,我们有一个混合系统-有些站点位于防火墙后面,有些则不在防火墙后面。一个完整的解决方案将是理

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

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

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

它是否可以像获取
Runtime.exec(String)
返回的流程对象的输入和输出流一样简单,并将我的命令发送到输入并读取输出上的响应?或者我应该连接到端口23(通常的telnet端口),然后像任何其他客户机-服务器系统一样工作。或者其他完全不同的东西

我正在继续尝试,只是在这一点上头脑风暴

代码:(删除敏感信息)


你为什么不直接使用套接字系统呢

在端口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();
    }
}

资源:

    • telnet几乎是纯tcp。您可能可以建立套接字连接、编写命令、读取响应


      telnet确实有一些可以与数据流混合的控制命令。您可能可以通过编程忽略它们。或者,为了完全了解协议,使用java telnet客户端包。

      是一种脚本化(非java)的可能性。这是一个较旧的工具,请参见。

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


      我在de.mud.jta上编写了一个驱动程序,但它使线程处于打开状态,我不知道在哪里以及如何修复这些线程。在我看来,一定有比在协议级别编码或这种古老的JTA东西更好的东西。

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


      已尝试,但readLine()已锁定。我将readLine()放在一个循环中以读取所有接收到的行,但它几乎立即锁定。我看到的是:该死的返回键!我看到的是供应商的名称\n空行\n用户名:\n此时它冻结。我知道readLine()会阻塞,因此我怀疑它正在等待EOF解除阻塞,但从未收到过EOF,因此我无法发送用户名等。这正是我想要避免的低级别细节。当然,我可以查找用户名:而不必阅读下一行,但我想避免编写自己的telnet应用程序:)无论如何,在发送用户名之前,您必须等待用户名被询问,因此基本上您仍然需要编写自己的“telnet应用程序”。但是对于您当前的问题,您应该使用两个线程,一个用于阅读,另一个用于在正确的时间发送答案。在发送用户名后,我尝试了不同的read-all锁定变体。接下来的读取块-我甚至没有得到密码:prompt.Ha,找到了。你忘记刷新数据了。尝试
      新建PrintWriter(sock.getOutputStream(),true)
      以启用自动刷新,或者您可以在每次
      println()
      之后手动调用
      flush()
      。您能推荐一个telnet包吗?最好简单且小。
      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();
          }
      }