如何从 Java 中的单个命令 (ssh exec) 获取 SSH 输入/输出(当前:sshj)?

Ber*_*aug 5 java security ssh kotlin gitblit

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

\n\n

除了不为我工作之外,我真的很喜欢 sshj\xe2\x80\x99s 的抽象级别,大多数其他 Java/SSH 库的级别要低得多,我的用例既不想也不需要这个。

\n\n

细节:

\n\n

作为开发人员入门工具的一部分,我\xe2\x80\x99m 尝试在 gitblit 服务器上安装 ssh\n公钥,其模式为\n https://github.com/hierynomus/sshj/blob/master/examples/ src/main/java/net/schmizz/sshj/examples/Exec.java

\n\n

I\xe2\x80\x99m 使用 sshj:

\n\n
compile \'com.hierynomus:sshj:0.21.1\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

平台:Koltin 1.1.3-2(JRE 1.8.0_131-b11、Mac 10.12 上的 Azul Zulu)

\n\n

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

\n\n

我在 Repl 中将其缩减为这样,现在只是想获取 gitblits 帮助消息:

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

这会产生大量输出,其中包括一个听起来很奇怪的错误\n“[PROTOCOL_ERROR] Received CHANNEL_SUCCESS”。我在https://pastebin.com/d3Y1tc8r上发布了完整的输出。

\n\n

如果我然后让它静置,一段时间后它就会因超时而死亡。没有产出得以实现。

\n