2017-07-26 14 views
0

Apacheのsshd-coreを使用してJavaベースのSSHサーバーを移行しようとしています。jline2からjline3を使用し、JSchクライアントを使用してシェルコマンドを接続して実行します。 jline2では、すべてうまく動作します。JLine3とJSchクライアントを使用したJava SSHサーバー

jline3では、OSXでSSHクライアントを介してコマンドを実行するとうまく動作します。しかし、私はそれがJSchで動作するように見えることはできません。以下

取り付けスタックトレース:

Exception in thread "Thread-4" org.jline.reader.EndOfFileException: org.jline.utils.ClosedException: InputStreamReader is closed. 
    at org.jline.keymap.BindingReader.readCharacter(BindingReader.java:140) 
    at org.jline.keymap.BindingReader.readBinding(BindingReader.java:109) 
    at org.jline.keymap.BindingReader.readBinding(BindingReader.java:60) 
    at org.jline.reader.impl.LineReaderImpl.readBinding(LineReaderImpl.java:709) 
    at org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:515) 
    at org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:385) 
    at test.ssh.jline3.EchoSshSessionInstance.run(EchoSshSessionInstance.java:64) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.jline.utils.ClosedException: InputStreamReader is closed. 
    at org.jline.utils.InputStreamReader.read(InputStreamReader.java:191) 
    at org.jline.utils.NonBlockingReader.run(NonBlockingReader.java:273) 
    ... 1 more 

サンプル・プロジェクトは、事前にgithub

おかげで見つけることができます。

答えて

0

サンプルプロジェクトは、動作中のJLine3コードで更新されました。これを行うにはPipedInputStreamとPipedOutputStreamを使う必要がありました。例えば:gnodet's response

JSch jsch = new JSch(); 
Session session = jsch.getSession("admin", "localhost", 8022); 
session.setPassword("xxx"); 
Properties config = new Properties(); 
config.put("StrictHostKeyChecking", "no"); 
session.setConfig(config); 
session.connect(); 
ChannelShell channel = (ChannelShell) session.openChannel("shell"); 
PipedInputStream pis = new PipedInputStream(); 
PipedOutputStream pos = new PipedOutputStream(); 
channel.setInputStream(new PipedInputStream(pos)); 
channel.setOutputStream(new PipedOutputStream(pis)); 
channel.connect(); 
pos.write("exit\r".getBytes(StandardCharsets.UTF_8)); 
StringBuilder sb = new StringBuilder(); 
int i; 
while ((i = pis.read()) != '\n') { 
    sb.append((char) i); 
} 
assertEquals("exit\r", sb.toString()); 
channel.disconnect(); 
session.disconnect(); 

感謝

関連する問題