1

sshjを使用してリモートマシンに接続し、さまざまな値を取得しています。sshjで理解しているように、次のコードを実行してリモートマシンのホスト名を取得すると、次のようになります。

SSHClient sshClient = new SSHClient();
Session session = sshClient.startSession();
Command commandObject = session.exec("hostname");

inputstreamを取得することで戻り値を取得できることを知っています

session.getInputStream();

私が抱えていると思われる問題は、セッションオブジェクト(およびコマンド)が「一度使用してから使い捨て」の方法で設計されていることです。したがって、これを念頭に置いて、リソースをクリーンアップするために、セッションが終了したらセッションを閉じたいと思います。

commandObject.close();

ただし、sshjは非同期であるため、コールバック機能が組み込まれていないようであるため、入力ストリームで戻り値が利用可能になる時期を判断できません。

この問題を回避するために私が考えることができる唯一の方法は、入力ストリームを検査する前に、事前定義された期間スリープすることです。しかし、これは単なるハックのように感じます。これらすべてに対してより良い解決策があることを願っています。

誰かがsshjを使用して同様の問題を抱えていましたか?考えられる解決策はありますか?

乾杯!

4

1 に答える 1

0

セッション オブジェクトで join() を呼び出すことができます。コマンドが終了すると、このメソッドは戻ります (またはタイムアウトになると)。次に、 getExitCode() -> Integer で終了コードを確認できます。これは、終了コードが受信されなかった場合は null になる可能性があります。

編集:戻り値とは、コマンドによって生成された出力を意味していましたか? getInputStream() または getErrorStream() によって返される InputStream は available() メソッドを実装するため、それに基づいてソリューションを実装できます。

于 2011-10-22T09:34:29.207 に答える