我正在尝试使用java代码通过telnet从另一个Linux系统连接到远程linux系统,如下所示:
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 -l\n";
output.write(commandInput);
output.flush();
commandInput = "pwd\n";
output.write(commandInput);
output.flush();
commandInput = "exit\n";
output.write(commandInput);
output.flush();
commandInput = "uname -a\n";
output.write(commandInput);
output.flush();
commandInput = "exit\n";
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();
}
}
我可以连接到远程机器并在第一次退出之前执行命令,并在第一次退出时从远程机器注销。现在,问题是我无法在第一次退出后执行命令,即使它从/ bin / bash退出命令,它将使用代码0完成进程执行。如果我在第一次退出后销毁进程,则BufferedReader和BufferedWriter赢了如果进程退出代码0,通常可以正常工作。我不确定是什么原因导致第一次退出后不执行命令。如果有人已经在某个时候面对它,请让我知道答案。
由于
Ashutosh说
答案 0 :(得分:1)
阅读When Runtime.exec()
won't,在调用外部可执行文件时,它有吨的好建议。
您的代码很可能出现的问题是,在代码结束之前,您不会阅读该进程的stdout
。这可以轻松导致进程的输出缓冲区已满并且在您阅读之前无法再进行任何输出。
您必须在单独的线程上读取进程的输出(有关详细信息,请参阅文章和代码)。