我正在尝试使用 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 退出,它通常会工作。我不确定是什么导致第一次退出后不执行命令。如果有人曾经遇到过,请告诉我答案。
谢谢
阿舒托什
最佳答案
阅读When Runtime.exec()
won't ,它在调用外部可执行文件时提供了大量的好建议。
您的代码很可能存在的问题是您直到代码结束才读取进程的 stdout
。这可以很容易导致进程的输出缓冲区已满,并且在您阅读一些内容之前无法再输出任何内容。
您必须在单独的线程上读取进程的输出(有关详细信息和代码,请参阅文章)。
关于java - 从 Java 远程登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5853703/