第二次调用时,jsch通道断开连接

时间:2015-06-04 12:51:43

标签: java jsch channel

我的要求是使用java通过ssh连接到远程机器。我正在使用jsch来做同样的事情。我有一系列要执行的命令,每个命令的执行取决于前一个命令的输出。

Fox示例,如果我正在执行:

 ls -l 

通过调用

登录我的远程机器后
runCommand(“ls -l\n”);

根据我从上面步骤得到的输出,我需要创建一个目录:

runCommand(“mkdir test\n”); 

执行此操作后,我得到了:

com.jcraft.jsch.JSchException: failed to send channel request
at com.jcraft.jsch.Request.write(Request.java:65)
at com.jcraft.jsch.RequestPtyReq.request(RequestPtyReq.java:76)
at com.jcraft.jsch.ChannelSession.sendRequests(ChannelSession.java:212)
at com.jcraft.jsch.ChannelShell.start(ChannelShell.java:44)
at com.jcraft.jsch.Channel.connect(Channel.java:152)
at com.apple.mailmove.ssh.ExecuteSecureShellCommand.runCommand(ExecuteSecureShellCommand.java:90)
at com.apple.mailmove.ssh.ExecuteSecureShellCommand.main(ExecuteSecureShellCommand.java:160)

这是runCommad代码:

//Find below my method
 public void runCommand(String command)
  {
  try{
    is = new ByteArrayInputStream(command.getBytes());
   channel.setInputStream(is);
    channel.setOutputStream(baos);
    channel.connect(15 * 1000);
    // Wait three seconds for this demo to complete (ie: output to be streamed to us).
    Thread.sleep(3*1000);
    for (int timeout = 200000; timeout > 0; timeout--) 
    {
      if(baos.size() != 0)
      {
        System.out.println(baos.toString());
        break;
      }
      else
      {
        System.out.println("No output!!!!");
        Thread.sleep(5000); // wait a bit then try again
      }
    }
  }
  catch(Exception e)
  {
     e.printStackTrace();
  }
 }

使用

检查连接状态
channel.isConnected 
调用channel.conenct(15*1000)之前的

方法并显示true。调用channel.conenct(15*1000)后,通道连接状态将返回false。

我无法理解为什么在第二次调用channel.connect(15*1000)时通道断开连接。有没有其他方法可以逐个执行命令,以便我可以获取上一个命令的输出并执行第二个命令?

1 个答案:

答案 0 :(得分:1)

为了通过SSH运行一个或多个命令,我建议使用JSch提供的exec通道。有关完整示例,请参阅this page

您必须更改代码才能为要运行的每个命令创建新通道:

public void runCommand(String command) {
    ChannelExec channel = (ChannelExec)session.openChannel("exec");
    channel.setCommand(command);

    try (InputStream stdOut = channel.getInputStream(); 
         InputStream stdErr = channel.getErrStream()) {
        channel.connect(TIMEOUT);
        // read from stdOut and stdErr
    }

    channel.disconnect();
}