java - 使用 Java 发送 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();
    }
}

资源:

关于java - 使用 Java 发送 telnet 命令并读取响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3763511/

相关文章:

Java:计算大量位置之间的距离和性能

java - 使用 Hibernate 将图像保存在数据库中

java - 从多个线程修改数组

java - Neo4j : Retrieving All Nodes and Relationship connected to a Node in Neo4j Rest OR through Cypher

java - 如何以及在哪里可以解释从 java.lang.String 返回的 Java 错误消息 "3"?

java - 如何在 Spring Data Neo4j 中实现双向关系?

java - 具有抛出异常的 block 的代码覆盖率

java - Spring(@SpyBean)与 Mockito(@Spy)

java - 最终类中的 protected 与包私有(private)

java - 如何在共享一个共同值的多个二维数组之间进行迭代?