ホームページ  >  記事  >  Java  >  Unix コマンドを Java の JSch 経由で実行すると、「見つかりません」エラーが発生して失敗するのはなぜですか?

Unix コマンドを Java の JSch 経由で実行すると、「見つかりません」エラーが発生して失敗するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-12 00:33:02980ブラウズ

Why do Unix commands fail with

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 コマンドが「... 見つかりません」で失敗する、setPty が有効になっている場合でも、JSch を使用して Java を通じて実行された場合
  • JSch を使用して実行されたコマンドは、SSH 端末での動作とは異なる動作をします (バイパス確認) "yes/"no") のプロンプト メッセージ
  • JSch: ユーザー環境変数を "exec" チャネルに公開する方法はありますか?
  • SSH.NET SshClient で実行されるコマンド (.4gl) .RunCommand が「そのようなファイルまたはディレクトリはありません」で失敗します

以上がUnix コマンドを Java の JSch 経由で実行すると、「見つかりません」エラーが発生して失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。