2016-07-01 17 views
0

Ich verwende JSCH-Bibliothek für die Verbindung über SSH in meiner Android App. Aus irgendwelchen Gründen, wenn ich Android N Entwickler-Vorschau bin mit erhielt ich folgenden Stacktrace:Android N mit JSCH Shell-Shell-Ausgabe

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) 

Dieser Fehler ich nach dem Verbindungsprozess erhalten, wenn ich zur Eingabe einiger Daten auf die ssh Shell-Sitzung versuchen.

In Android 6.0 und darunter ist alles in Ordnung.

Können Sie mir bitte mit diesem seltsamen Verhalten helfen?

Vielen Dank im Voraus!

Antwort

0

Ich habe das gleiche Problem konfrontiert. Ich habe PrintStream verwendet, um zuvor Befehle einzugeben, funktioniert aber nicht unter Android 7.0. Ich habe keine Idee warum.

Die Lösung besteht darin, stattdessen PipedInputStream zu verwenden. Hier ist das Beispiel:

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()); 
0

ich auch Probleme ähnlich dem konfrontiert beschrieben, während Android 7.1 und jsch-0.1.54 verwenden. Mein Host OpenSSH /var/log/auth.log zeigte "Disconnecting: Paket korrupt" und "Schlechte Paketlänge ..." Fehler.

I Reaven Lösung oben mit einigen Modifikationen durchgeführt:

Initialisierung:

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

Async verbinden Logik:

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

Async Befehlserzeugung und zusätzlich zum Ausgangsstrom:

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

Alles scheint wieder gut zu funktionieren.