Как получить SSH вход / выход из одной команды (ssh exec) в Java (текущий: sshj)?

tl; dr: как я могу получить ввод-вывод при отправке команды exec с помощью sshj? В качестве альтернативы, какие другие библиотеки Java SSH обеспечивают аналогичный уровень абстракции, но могут работать лучше для моего варианта использования?

Помимо того, что я не работаю для меня, мне очень нравится уровень абстракции sshj, большинство других Java / SSH-библиотек намного ниже, и я не хочу и не нуждаюсь в этом для моего варианта использования.

Детали:

Как часть инструмента для разработчиков на платформе, я пытаюсь установить открытые ключи ssh на сервере gitblit, созданный по шаблону после https://github.com/hierynomus/sshj/blob/master/examples/src/main/java/net /schmizz/sshj/examples/Exec.java .

Я работаю с sshj:

compile 'com.hierynomus:sshj:0.21.1' 

Платформа: Koltin 1.1.3-2 (JRE 1.8.0_131-b11, Azul Zulu на Mac 10.12)

К сожалению, я не могу читать или писать в потоки.

Я сократил это до этого в Repl, теперь просто пытаюсь получить сообщение gitblits help:

 import org.slf4j.Logger import org.slf4j.LoggerFactory import java.util.logging.Level import java.util.logging.LogManager fun sshClientWithTrustingHostkeyVerifier(): SSHClient { return SSHClient(DefaultConfig()).also { client -> client.addHostKeyVerifier(object : OpenSSHKnownHosts(File(sshDir(), "known_hosts")) { override fun hostKeyUnverifiableAction(hostname: String?, key: PublicKey?): Boolean { super.write(SimpleEntry(null, hostname, KeyType.fromKey(key), key)) return true } }) } } LogManager.getLogManager().let {lm -> lm.loggerNames.asSequence().forEach { lm.getLogger(it).apply{ level = Level.FINEST handlers.forEach { it.level = Level.FINEST }}}} val log: Logger = LoggerFactory.getLogger("foo") log.debug("a") val client = sshClientWithTrustingHostkeyVerifier() log.debug("b") client.connect("the.gitblit.local", 29418) log.debug("c") client.authPassword("my_account", "my super password") log.debug("d") val session = client.startSession() log.debug("e") val cmd = session.exec("keys --help") log.debug("f") log.debug(cmd.inputStream.readBytes().toString()) log.debug("g") log.debug(cmd.errorStream.readBytes().toString()) log.debug("h") cmd.join() log.debug("i") log.debug("Exit status: {}", cmd.exitStatus) 

Это приводит к большому объему вывода, который включает в себя странную звуковую ошибку "[PROTOCOL_ERROR] Получено CHANNEL_SUCCESS". Я опубликовал полный вывод на https://pastebin.com/d3Y1tc8r .

Если я тогда позволяю ему сидеть, через некоторое время он умирает от таймаута. Никакой выход никогда не материализуется.