0

Java アプリケーションを sudo で起動すると、正しく実行できません。私のアプリケーションは、クライアント接続にソケットを使用し、データベース接続も確立します。アプリを正常に起動した場合:

java myApp

すべてが完璧に機能します。ただし、これを Web サイトからバックグラウンドで開始できるようにしようとしています。そこで、exec() または passthru() を使用して起動する PHP を作成しました。最初はこれでうまくいくように見えましたが、すぐにソケットが実際には接続されていないことに気付きました。さらに試行錯誤を重ねた結果、これはjava myApproot としてログインしているが、PHP が root として実行されていないため、セキュリティ上の問題があるためであるという結論に達しました。

そこで、スクリプトを作成し、パスワードなしでスクリプトを実行できるように SUDOERS を設定しました。スクリプトにはjava myApp. スクリプトを次のように実行すると:

bash myScript

ソケットが接続されません。(つまり、アプレット クライアントが接続しようとしてハングアップします。)

sudo bash myScript

jdbc MySql ドライバーが見つかりません。これを解決するために、コンパイルや実行時に -classpath を使用したり、jdbc jar のコピーを別の場所に配置したりするなど、クラスパスをいじるなど、さまざまな方法を試しましたが、うまくいきませんでした。どうやら、sudo 環境は、Java が jdbc ドライバーを見つけられない原因となる root としてログインした環境とは微妙な点で異なります。

sudo bash myScript明確にするために、ルートとしてログインしている ときに実行しようとすると、jdbc ClassPathNotFound (接続の試行方法によっては適切なドライバーエラーがありません) が発生します。bash myScriptrootとしてログインしているすべてのカウントで問題なく動作します。PHP スクリプトからいずれかを実行しようとすると、ソケットまたは jdbc のいずれかである可能性があるクライアント アプレットが接続できません。私はいかなる種類の IDE も使用していません。テキスト エディターで編集し、javac を使用してコンパイルするだけです。

任意の提案をいただければ幸いです。

アップデート:

それが役立つ場合、サーバーはCentOSを実行しています。-E は環境の問題だと思いました(環境の損失が原因だと推測していましたが、見つけたsudoのドキュメントは解決策を見つけるのに役立ちませんでした)。試してみpassthru('sudo -i bash /path/to/myScript.sh');ましたが、Java アプリはまだ起動できません。パススルーからブラウザに何も表示されません。スクリプトは次のようになります。

cd /path/to/app
java myApp

まだ自分でいじっています。私はこの仕事をするのに近づいていることを知っています。

4

1 に答える 1

0

私が理解しているコメントによる議論の後、それsudo -Eは(あなたのユーザー名に対して)機能します-これは何が起こっているのかの景品のようです:

対話型ログオンには多くの環境変数が設定されており、そのうちのいくつかは Java アプリの実行に必要です。

通常、sudoユーザーを切り替える前に環境を「クリーンアップ」します。そのため、必要な環境変数が削除されますがsudo -E、環境はそのまま維持され、機能します。

現在、Web サーバー ユーザー (Ubuntu の www-data など) には環境が設定されておらsudo -Eず、欠陥のある環境が維持されています。

これに対処する方法はいくつかありますが、最も簡単な方法は、sudo -iログインしたかのようにターゲット ユーザーのシェルを実行することです。

于 2012-05-24T04:25:41.467 に答える