【问题标题】:jsch channel gets disconnected when called for the second timejsch 频道在第二次调用时断开连接
【发布时间】:2015-06-04 12:51:43
【问题描述】:

我的要求是使用 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) 时通道会断开连接。有没有其他方法可以一一执行命令,以便我可以获取上一个命令的输出并执行第二个命令?

【问题讨论】:

  • 您能否编辑您的问题以显示您如何创建通道对象,以及您如何为要运行的每个命令调用runCommand()

标签: java jsch channel


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多