2

SSH シェルでは .sh スクリプトが正常に動作するのに、PHP または crontab では実行できない原因は何ですか?

ゲームサーバーを実行している VPS を持っていますが、それを保守可能にするために、面倒なプロセス (サーバーのセットアップまたは削除など) の多くを自動化し、重要な機能 (サーバーの開始および停止など) を簡単にすることを計画しています。本当に必要としている人には受け入れられます。

さて、シェル スクリプトを作成してテストしたところ、まったく問題なく動作しました。startserver はサーバーを起動し、restartserver はサーバーを再起動しました。しかし、PHP から実行した場合、または後でわかったように、crontab でサーバーを起動しても魔法のように機能しません。それらを停止し、実行されているかどうかを確認し、更新し、他のすべての機能が意図したとおりに機能しましたが、サーバーを起動しても何もしませんでした. 何も出力せずに0を返しました。

たとえば、どちらの場合でも機能するスクリプトの例を次に示します: (statusserver.sh)

/sbin/start-stop-daemon -v -t --start --exec ~mta/servers/$1/files/mta-server -- -d

そして、これはいずれの場合も機能しないものです: (startserver.sh)

/sbin/start-stop-daemon -v --start --exec ~mta/servers/$1/files/mta-server -- -d

唯一の違いは、statusserver.sh に "-t" が含まれていることです。これは、-t なしで同じコマンドを実行すると実際に成功するかどうかのみを示します。そして、次のように statusserver.sh を実行します。

sudo -u mta ~mta/sh/statusserver.sh test

確かに機能し、「Would start ~mta/servers/test/files/mta-server -d」の行に沿って何かを出力します。しかし、これを行う:

sudo -u mta ~mta/sh/startserver.sh $2

絶対に何もしません。何も出力せず、実際には 0 を返します (これは、操作が成功したことを意味するはずです)。

楽しい部分: サーバーが既に実行されている場合、startserver.sh は本来の処理を実行します。つまり、サーバーが既に実行されており、エラー コードを返しているとします。(start-stop-daemon は私のためにそれを行うのに十分親切だからです) しかし、それは何も起動することを完全に拒否します。

start-stop-daemon を次のように置き換えます。

sudo -u mta ~mta/servers/test/files/mta-server -d

まったく同じことを行います: 実行を拒否するだけで、0 を返します。

ところで、それは sudo の問題ではありません。以下もうまくいくので、私はかなり確信しています

sudo -u web1 sudo -u mta ~mta/scripts/startserver.sh test

私の質問に戻ります: Linux、Shell、Bash などが、PHP または crontab を介して実行されたときにアプリケーションの起動を完全に拒否し、SSH を介して起動されたときに喜んでそれを受け入れる原因は何ですか? 切り替える必要のある設定はありますか? 私がやりたいことを妨げている可能性のあるパッケージはありますか? 私が見逃している他のものはありますか?

4

2 に答える 2

0

sudo の使用を検討してください。

/etc/sudoer を (visudo を使用して) Apache を実行するユーザー (通常は 'nobody' ユーザーまたは 'apache' ユーザー) 用に設定します。これは Apache が通常実行するものだからです。NOPASSWD オプションを使用して、実行するコマンドへの sudo アクセスを許可します。

PHP スクリプトで、exec() を使用してコマンドを実行し、デーモンを開始/停止し、コマンドの前に sudo コマンドを付けます。

sudo に関する記事は次のとおりです。

http://www.cyberciti.biz/tips/allow-a-normal-user-to-run-commands-as-root.html

于 2012-08-03T23:30:26.210 に答える
0

ジャスティンが触れていたと思いますが、具体的には言いませんでしたが、スクリプトを実行できないという問題は、Apache ユーザー アカウント (通常は意図的にかなり制限されています) がユーザーの権限のため、ホーム ディレクトリ。通常、ユーザーと root だけが自分のホーム ディレクトリを見ることができます。sudo を使用してスクリプトをホーム ディレクトリで実行したり、スクリプトをユーザーのホーム ディレクトリの外に移動したり、場合によってはスクリプト/ホームの権限を変更して、Apache によってユーザーのホーム ディレクトリで実行できるようにしたりできます。

于 2012-08-04T00:04:27.950 に答える