tl;dr: sshj を使用して exec コマンドを送信するときに I/O を取得するにはどうすればよいですか? あるいは、同様のレベルの抽象化を提供する Java SSH ライブラリのうち、私のユースケースにより適しているものは他にあるでしょうか?
私のために働いていないことは別として、私はsshjの抽象化レベルが本当に好きです。他のほとんどのJava / SSHライブラリははるかに低レベルであり、私のユースケースではこれを望んでも必要もありません。
詳細:
開発者のオンボーディング ツールの一部として、ssh 公開鍵を gitblit サーバーにインストールしようとしています 。 /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に投稿しました。
そのままにしておくと、しばらくするとタイムアウトで死にます。いかなるアウトプットも実現しません。