2017-07-26 85 views
0

我正在尝试使用apache sshd-core从使用jline2到jline3并使用JSch客户端连接和执行shell命令来迁移基于Java的SSH服务器。使用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来做到这一点。 E.g:

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

由于gnodet's response