私のJavaアプリケーションは次のように動作する必要があります。
- ユーザーがGUIでbashコマンドを選択し、「送信」を押します。
- アプリケーションは、コマンドごとに個別の独立した回答を返します(たとえば、それらを異なるファイルに保存できます)。
- コマンドはそれぞれ、バッチではなくインタラクティブに実行されます( "ls \ n pwd \ n"などのようなものにすることはできません)
- 各コマンドの後で、アプリケーションは結果に問題がないかどうかを確認します。その場合、次のコマンドを送信します。
su <user>
リモートホストで実行する必要があります。
これはより大きなアプリのプラグインになるので、「他の何かを試してみてください」(RPC、Webサービスなど)のような答えは役に立ちません:(
私が理解している限り、私はシェルを使用するか、少なくともチャネルを接続したままにする必要があります。
jsch、sshj、ethz.ssh2をテストしましたが、悪い結果になりました。
「sending-commands-to-server-via-jsch-shell-channel」などの質問に対するstackoverflowの回答を掘り下げました。しかし、それらはすべて、コマンド全体を1行で送信することに重点を置いています。インタラクティブで永続的なSSHセッションが必要です。
私はExpectJを使用しました(出力ストリームを少しハックしました)。ポイント1、3、4、5を解決しました。
しかし、ポイント2には問題があります。私のアプリでは、個別の回答を取得する必要があります。しかし、それらの長さはわかりません。コマンドプロンプトは異なる場合があります。誰もがExpectJを「ハック」する方法を知っているので、それはいくらかより同期されますか?私はこのように振る舞うことを探しています:送信、完全な回答を待つ、送信、待機...いくつかの基本的な同期のトリックを試しましたが、これはタイムアウトに終わり、通常は接続が失われます。