【问题标题】:Android N with JSCH shell channel issue带有 JSCH shell 通道问题的 Android N
【发布时间】:2016-11-03 18:58:06
【问题描述】:

我在我的 Android 应用程序中使用 JSCH 库通过 SSH 进行连接。由于某些原因,当我使用 Android N 开发者预览版时,我收到了以下堆栈跟踪:

W/System.err: com.jcraft.jsch.JSchException: SSH_MSG_DISCONNECT: 2 Packet corrupt 
W/System.err:     at com.jcraft.jsch.Session.read(Session.java:987)
W/System.err:     at com.jcraft.jsch.Session.run(Session.java:1381) 
W/System.err:     at java.lang.Thread.run(Thread.java:761)

当我尝试向 ssh shell 会话输入一些数据时,在连接过程后收到此错误。

在 Android 6.0 及以下版本一切正常。

你能帮我解决这个奇怪的行为吗?

提前谢谢你!

【问题讨论】:

    标签: java android shell ssh jsch


    【解决方案1】:

    我也遇到过同样的问题。我之前使用 PrintStream 输入命令,但它不适用于 Android 7.0。我不知道为什么。

    解决方案是改用 PipedInputStream。 示例如下:

    ChannelShell shellChannel = (ChannelShell) session.openChannel("shell");
    shellChannel.setOutputStream(outputStream, true);
    InputStream in = new PipedInputStream();
    PipedOutputStream pin = new PipedOutputStream((PipedInputStream) in);
    shellChannel.setInputStream(in);
    shellChannel.connect();
    pin.write("ls \r").getBytes());
    

    【讨论】:

      【解决方案2】:

      在使用 Android 7.1 和 jsch-0.1.54 时,我也遇到了与上述类似的问题。我的主机 OpenSSH /var/log/auth.log 显示“断开连接:数据包损坏”和“数据包长度错误......”错误。

      我在上面做了一些修改,实现了 reaven 的解决方案:

      初始化:

      private Channel channel=null;
      private InputStream in = null;
      private PipedOutputStream pin =null;
      

      异步连接逻辑:

      channel= session.openChannel("shell");
      in = new PipedInputStream();
      pin = new PipedOutputStream((PipedInputStream) in);
      channel.setInputStream(in);
      channel.connect(3000);
      

      异步命令生成和添加到输出流:

      cmd=cmd+"\r\n";
      pin.write(cmd.getBytes());
      pin.flush();
      

      一切似乎又恢复正常了。

      【讨论】:

        猜你喜欢
        • 2011-10-09
        • 2013-12-31
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多