telnet с Java

#java #linux #telnet

#java #linux #telnet

Вопрос:

Я пытаюсь подключиться к удаленной системе Linux из другой системы Linux через telnet, используя Java-код, как показано ниже:

 public static void main(String[] args) throws InterruptedException
{
    // TODO Auto-generated method stub  /usr/bin/telnet
    try
    {
        String line, commandInput;
        ProcessBuilder telnetProcessBuilder = new ProcessBuilder("/bin/bash");
        telnetProcessBuilder.redirectErrorStream(true);
        Process telnetProcess = telnetProcessBuilder.start();
        BufferedReader input = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream()));
        BufferedWriter output = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream()));
        commandInput = "telnet <hostname> -l <username>n";
        output.write(commandInput);
        output.flush();
        commandInput = "<password>n";
        output.write(commandInput);
        output.flush();
        commandInput = "ls -ln";
        output.write(commandInput);
        output.flush();
        commandInput = "pwdn";
        output.write(commandInput);
        output.flush();
        commandInput = "exitn";
        output.write(commandInput);
        output.flush();
        commandInput = "uname -an";
        output.write(commandInput);
        output.flush();
        commandInput = "exitn";
        output.write(commandInput);
        output.flush();
        while((line = input.readLine())!= null)
            System.out.println(line);
        //telnetProcess.destroy();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
  

Я могу подключиться к удаленному компьютеру и выполнить команды перед первым выходом, и он выходит из системы с удаленного компьютера при первом выходе. Теперь проблема в том, что я не могу выполнять команды после первого выхода, даже если это команда exit из /bin / bash, которая завершит выполнение процесса с кодом 0. И если я уничтожу процесс после первого выхода, BufferedReader и BufferedWriter не будут работать, что обычно работает, если процесс завершается с кодом 0. Я не уверен, что может вызвать это неисполнение команд после первого выхода. Пожалуйста, дайте мне знать ответ, если кто-нибудь уже сталкивался с этим когда-нибудь.

Спасибо

Ashutosh

Ответ №1:

Читайте, когда Runtime.exec() не хотите, в нем есть тонны полезных советов при вызове внешних исполняемых файлов.

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

Вы должны прочитать выходные данные процесса в отдельном потоке (смотрите статью для получения подробной информации и кода).

Комментарии:

1. Привет, Иоахим, спасибо за ответ. Как вы сказали, я немного изменил код и вместо telnet и его пароля я просто ввел обычные команды в / bin / bash, 10 обычных команд, таких как pwd, uname -a, whoami, finger<имя пользователя>, cat <имя файла> объемом почти 100 КБ текста и выполнил команду «ls / etc /init.d -l n» почти 10 раз, что довольно много в моей системе Linux, и, наконец, дал команду exit, и программа работала безупречно со всеми выводами, напечатанными в окне консоли, и завершилась с кодом 0. Но у меня возникла эта проблема после того, о чем я спрашивал. В любом случае спасибо за быстрый ответ.