Java SSH-сервер с JLine3 и JSch-клиентом

Я пытаюсь перенести SSH-сервер на основе Java с помощью Apache sshd-core с использования jline2 на jline3 и использования клиента JSch для подключения и выполнения команд оболочки. С jline2 все работает просто отлично.

С jline3 он прекрасно работает при выполнении команд через клиента SSH в OSX. Тем не менее, я не могу заставить его работать с 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

Заранее спасибо.

1 ответ

Пример проекта был обновлен рабочим кодом JLine3. Для этого нужно использовать PipedInputStream и PipedOutputStream. Например:

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

Благодаря ответу гнодет

Другие вопросы по тегам