2

私のJavaアプリケーションは次のように動作する必要があります。

  1. ユーザーがGUIでbashコマンドを選択し、「送信」を押します。
  2. アプリケーションは、コマンドごとに個別の独立した回答を返します(たとえば、それらを異なるファイルに保存できます)。
  3. コマンドはそれぞれ、バッチではなくインタラクティブに実行されます( "ls \ n pwd \ n"などのようなものにすることはできません)
  4. 各コマンドの後で、アプリケーションは結果に問題がないかどうかを確認します。その場合、次のコマンドを送信します。
  5. 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を「ハック」する方法を知っているので、それはいくらかより同期されますか?私はこのように振る舞うことを探しています:送信、完全な回答を待つ、送信、待機...いくつかの基本的な同期のトリックを試しましたが、これはタイムアウトに終わり、通常は接続が失われます。

4

2 に答える 2

2

UnixユーティリティのJava実装であるExpectJを使用する必要があります。expect

于 2012-10-02T13:51:43.773 に答える
0

まだ問題があるかどうかはわかりませんが、いずれにせよ、他の人に貢献する可能性があります.

ExpectJ は実際、Unix の期待の Java 実装です。そして、あなたは間違いなく「Explore Expect Book」を購入してから調べるべきです。それだけの価値があります。

あなたの質問について: プロセスを生成するときは、返された出力をリッスンし、それをプロンプトに一致させてから、コマンドを送信します。出力を分析したい場合は、その出力をバッファリングし、次の send() の前にいくつかのアクションを実行します

そのためには、使用した spawn クラスの interact() メソッドを使用する必要があります。 http://expectj.sourceforge.net/apidocs/index.html

対話とその仕組みについては、http: //oreilly.com/catalog/expect/chapter/ch03.html でこの部分を探してください: 「対話コマンド」

于 2013-05-07T16:13:07.903 に答える