首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有JLine3和JSch客户端的Java SSH服务器

带有JLine3和JSch客户端的Java SSH服务器
EN

Stack Overflow用户
提问于 2017-07-26 15:36:37
回答 1查看 450关注 0票数 0

我正在尝试使用apache sshd-core将基于Java的SSH服务器从使用jline2迁移到jline3,并使用JSch客户机连接和执行外壳命令。使用jline2,一切都很好。

使用jline3,它在OSX中通过SSH客户端执行命令时工作得很好。然而,我似乎不能让它与JSch一起工作。

正在下面附加堆栈跟踪:

代码语言:javascript
复制
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上找到

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-08-21 12:37:46

样例项目已经使用有效的JLine3代码进行了更新。我需要使用PipedInputStream和PipedOutputStream来做这件事。例如:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45320387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档