JSch を使用して Java 経由で実行すると、特定の Unix コマンドが「コマンドが見つかりません」エラーで失敗する
この問題は、Java 経由で Unix コマンドを実行するときに発生します。 JSchライブラリを使用します。 SSH クライアントで動作しているにもかかわらず、「air not found」などのコマンドが失敗した場合は、さらなる調査が必要です。
根本原因:
対話型 SSH セッションとは異なり、 JSch の「exec」チャネルは擬似端末を割り当てません。これにより、異なる起動スクリプトのセットが実行され、異なる環境が生じる可能性があります。この場合、PATH 環境変数が異なるように設定され、「air」実行可能ファイルが使用できなくなる可能性があります。
解決策:
これに対処するには、いくつかの方法があります。優先順に問題を発行します:
-
フルパス実行:
コマンドで実行可能ファイルへのフルパスを使用し、環境への依存を排除します。
-
起動スクリプトの変更:
起動スクリプトを調整して、インタラクティブセッションと非インタラクティブセッションの両方で一貫した PATH。
-
ログインシェルの実行:
--login スイッチを使用して、ログイン シェル経由でコマンドを明示的に実行します。
-
環境の変更:
コマンド自体で環境を変更します。必要な PATH やその他の変数を設定します。
-
強制擬似ターミナル割り当て:
(非推奨) setPty(true) を使用して「exec」チャネルの擬似端末割り当てを強制しますが、潜在的な副作用に注意してください。
関連問題:
他の同様の問題が発生しており、以下で説明されています。リソース:
- setPty が有効でも、JSch を使用して Java 経由で実行すると、特定の Unix コマンドが「... 見つかりません」で失敗する
- JSch を使用して実行されたコマンドは、SSH ターミナルでの動作とは異なる(「はい/いいえ」の確認プロンプト メッセージをバイパスします)
- JSch: ユーザーを公開する方法はありますか?環境変数を "exec" チャネルに設定しますか?
- SSH.NET SshClient.RunCommand で実行されたコマンド (.4gl) が、「そのようなファイルまたはディレクトリはありません」というエラーで失敗します
以上がJSch を使用して Java 経由で実行すると、特定の Unix コマンドが「コマンドが見つかりません」というエラーで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。