Отправка команд 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.
Попробуйте Проверить Библиотеку Netty Java. у них есть хороший набор Telnet, SSH и других очень полезных сетевых библиотек