JSch 経由で Unix コマンドが「見つかりません」エラーで実行に失敗する
Java の JSch ライブラリを通じて特定の Unix コマンドを実行しようとすると、コマンドを実行できなかったことを示すエラーが発生する場合があります。
問題の理解
対話型 SSH クライアントとは異なり、JSch の「exec」チャネルはデフォルトでは疑似端末 (PTY) を割り当てません。この環境の違いにより、対話型セッションと比較して、起動スクリプトの実行や PATH 設定が異なる可能性があります。その結果、特定の環境変数に依存するコマンドが失敗する可能性があります。
根本原因の特定
根本原因を確認するには、SSH クライアントで PTY 割り当てを無効にし、次のことを試みます。コマンドを手動で実行します。同じ「見つからない」エラーが発生した場合は、対話型セッションと非対話型セッションで PATH 環境変数が異なることを示唆しています。
解決策
この問題に対処するにはでは、次の解決策を優先順に検討してください:
1.実行可能ファイルへのパスを明示的に定義するようにコマンドを変更します
String command = "/bin/air sandbox run <graph-path>";
2.起動スクリプトを調整して PATH を一貫して設定する
リモート サーバー上の起動スクリプトで、対話型セッションと非対話型セッションの両方で PATH が同一に設定されていることを確認します。
3.ログイン シェルを使用してコマンドを実行します
コマンドの先頭に「bash --login -c」を追加して、ログイン シェル経由で明示的に実行します。これにより通常、一貫した環境が設定されます:
String command = "bash --login -c \"air sandbox run <graph-path>\"";
4.コマンドで環境変数を直接設定する
特定の環境設定に大きく依存するコマンドの場合は、コマンド内で変数を直接設定することを検討してください。
String command = "PATH=\"$PATH;/path/to/air\" && air sandbox run <graph-path>";
5.強制的な PTY 割り当て (非推奨)
最後の手段として、.setPty(true) を使用して「exec」チャネルに PTY 割り当てを強制できます。ただし、このアプローチでは望ましくない副作用が生じる可能性があります。
追加の洞察や同様の問題については、次のリソースを参照してください。
以上がUnix コマンドを Java の JSch 経由で実行すると、「見つかりません」エラーが発生して失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。