#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. Но у меня возникла эта проблема после того, о чем я спрашивал. В любом случае спасибо за быстрый ответ.