Как получить ввод / вывод 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:

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] Received CHANNEL_SUCCESS". Я разместил полный вывод на https://pastebin.com/d3Y1tc8r.

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

0 ответов

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