0

我有使用 j2ssh sshclient 在 linux 服务器上执行远程命令的方法。远程命令的执行时间从几秒到一分钟不等。我需要 Java 程序等到命令完成执行后再继续,但它没有。Java 程序运行该命令,但在远程命令完成之前继续运行。这是我的方法:

//The connect is done prior to calling the method.

public static String executeCommand(String host, String command, String path)
        throws Exception
  { 
  cd(path);
  System.out.println("-- ssh: executing command: " + command + " on "
        + host);

  SessionChannelClient session = ssh.openSessionChannel();
  session.startShell();

  session.getOutputStream().write("sudo -s \n".getBytes());
  session.getOutputStream().write(command.getBytes());
  session.getOutputStream().write("\n exit\n".getBytes());
  IOStreamConnector output = new IOStreamConnector();
  java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
  output.connect(session.getInputStream(), bos);
  String theOutput = bos.toString();
  System.out.println("output..." + theOutput);

  session.close();

  disconnect();
  return theOutput;

  }
4

2 回答 2

1

这里的问题是您启动 shell,输出您的命令,然后线程化读取操作,因此从 Inputstream 读取是在另一个线程上执行的。您的函数的主线程立即移动到关闭会话,因此您的命令将在收到所有输出之前被终止。

为了防止这种情况,只需从会话的 Inputstream 读取,直到它在同一线程上返回 EOF,即删除 IOStreamConnector 的使用并手动读取到您的 ByteArrayOutputStream。然后在流返回 EOF 后调用 session.close(),因为这表明所有数据都已从服务器接收到。

byte[] buf = new byte[1024];
int r;
ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
while((r = session.getInputStream().read(buf)) > -1) {
    bos.write(buf, 0, r);
}
于 2015-07-20T10:47:38.110 回答
0

它应该按以下方式工作:

//The connect is done prior to calling the method.

public static String executeCommand(String host, String command, String path)
        throws Exception
  { 
  cd(path);
  System.out.println("-- ssh: executing command: " + command + " on "
        + host);

  SessionChannelClient session = ssh.openSessionChannel();
     if ( session.executeCommand(cmd) ) {
         java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
  output.connect(session.getInputStream(), bos);
  String theOutput = bos.toString();
  System.out.println("output..." + theOutput);
  }
  session.close();
于 2016-04-07T08:12:36.623 回答