5

tl;博士:使用 sshj 发送 exec 命令时如何获取 I/O?或者,还有哪些其他 Java SSH 库提供了类似的抽象级别,但可能更适合我的用例?

除了不适合我之外,我真的很喜欢 sshj 的抽象级别,大多数其他 Java/SSH 库的级别要低得多,我既不想也不需要它用于我的用例。

细节:

作为开发人员入职工具的一部分,我正在尝试在 gitblit 服务器上安装 ssh 公钥,以 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,Mac 10.12 上的 Azul Zulu)

不幸的是,我似乎无法读取或写入流。

我在 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上发布了完整的输出。

如果我然后让它坐下,一段时间后它会因超时而死。没有输出实现。

4

0 回答 0