Отправка команд telnet и чтение ответа с помощью Java

Я работаю в крупной организации, которая поддерживает множество различных сайтов в общенациональной сети. Наш поставщик поставляет диагностические инструменты для оборудования, которое мы используем на каждом сайте. Диагностика и отчеты доступны через Telnet.

проблема в том, что мы хотим контролировать все сайты одновременно и в настоящее время мы можем проверять их только по одному (через telnet).

Я уже построил что-то, что будет использовать Runtime.exec(String) для отправки команд ping на каждый IP адрес. Но теперь я хочу иметь возможность автоматически отправлять определенные команды, используя инструменты диагностики и отчетности поставщика. Есть идеи, как это сделать? Обратите внимание, что у нас есть гибридная система - некоторые сайты находятся за брандмауэром, некоторые нет. Полное решение было бы идеальным, но я также соглашусь на частичное.

может ли это быть так же просто, как получение входных и выходных потоков объекта процесса, возвращаемого Runtime.exec(String) и отправить мои команды на вход и чтение ответа на выходе? Или я должен подключиться к порту 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);
//}

5 ответов


почему бы вам просто не использовать систему сокетов ?

откройте сокет для выбранного сервера на Порту 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.

Я написал драйвер поверх de.грязь.jta, но он оставляет нити открытыми, и я не знаю, где и как их исправить. Мне кажется, что должно быть что-то лучше, чем кодирование на уровне протокола или этот старый JTA материал.


telnet-это почти голый tcp. вероятно, вы можете установить соединение с сокетом, написать команды, прочитать ответы.

ну-telnet имеет некоторые команды управления, которые могут быть смешаны с потоком данных. вероятно, вы можете запрограммировать их игнорировать. или, чтобы быть в курсе протокола, используйте клиентский пакет Java telnet.


ожидал является сценарием (не Java) возможность. Это более старый инструмент, см. Плюсы и минусы в Википедия.


Попробуйте Проверить Библиотеку Netty Java. у них есть хороший набор Telnet, SSH и других очень полезных сетевых библиотек

https://netty.io