• ベストアンサー

PHPスクリプトからサービスの再起動

お世話になります。 PHPスクリプトからリナックスのsquidのサービスを 再起動したいのですが、これは可能なんでしょうか? php4.3.9 apache2.0.52 rhl9 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

かなり苦労しているようですが、まだゴールまでの道のりは近くは無いかもしれません。ここで諦めるのでしたらそれっきり、しぶとく追求するのでしたらマスターまで(笑。 それはさておき、 PHPの質問と言うよりはLinuxの話になってしまいますが、、、 > ウインドウズなら簡単に、この人は777、このグループは666とか、視覚的にわかるじゃないですか? これはLinuxでも同じです。これはファイルの実行(アクセス)権限です。sudoで実行権限を与えるのはコマンドレベルです。 Linux(UNIX)では、もともと多くの人がログインしてコマンドを実行出来るように設計されています。rootでは全てのコマンドが実行出来ます。一般ユーザではcdとか、mkdir、viなどのコマンドは実行出来ますが、ユーザを追加する権限のuseraddや、サーバを再起動するコマンド実行権限はありません(一般ユーザが勝手にサービスを止めたら困りますよね)。当然、apacheにもサーバの実行権限等は与えられていないのですが、特別に与える事が出来るコマンドがsudoです。誰と誰にはこの管理権限を委譲する、と言う事が出来る訳です。 sudoの設定は、/etc/sudoers のファイルを編集する事で出来ます。当然root権限でないと編集出来ません。ここでapacheに実行権限を与えれば、与えられたコマンドが実行出来ます。 ところでなぜPHPスクリプトからサービスの再起動をしたいのですか?一般ユーザに再起動させる事は通常考えられませんが。リモートからWEB経由で管理したいと言うのでしたら、webminあたりを使ったらどうでしょうか?webminならsquidの再起動ぐらいはワンタッチですよ。

123daa
質問者

お礼

ありがとうございます。 まだまだ諦めるつもりは、毛頭ございません。 ただ、疲れているのは確かです。 LINUXは2ヶ月前から触りだしました。なんかよくわからないけど、RPMは成長するのに障害だろうと重い、tarボールのをダウンロードして、わからないなりにやってます。 今度は、DDNS使ってサーバーも公開してみようと思ってます。 ウインドウズだって最初はまったくわからなかったですもん。LINUXだって一緒ですよね。ただ・・ハードルは高すぎますが(TT PHPのスクリプトから再起動させたい理由ですが、 会社の内部のFWにソニックウォールを使ってまして、これにはコンテンツフィルタってのがあります。 まぁ有害サイトをとめるだけなんですが、実は日本語のエロサイトは全くノーチェックなんですね。 営業マンが出張するたびにデリヘルあさりまくりみたいな。 てっきり信頼してたのに・・ってことで、コンテンツフィルタ料を払うのをやめ、ログからうち専用のフィルタリストを作ろうと。もちろん、フリーのリストも取り込みますが。 で、squidのurl_regexを使ってブロックするのですが、新しいURLを登録するとこやつを再起動しないと反映しないのです。なんで、再起動する必要があります。 ただ、WEBMINってヤツでも可能なら問題ありません。実現できることがまず第一ですから。 WEBMINやってみます。 でも・・せっかく色々と教えてもらったので、PHPスクリプトから実現できるようには頑張ります。

その他の回答 (5)

回答No.6

5番の方が書かれている通り、visudoでやらないとまずいですね(笑。 visudoはviがある程度使えないと若干苦労しそうですね。 とは言え、Linuxでサーバ管理となるとviは避けて通れないでしょうから、頑張って下さい。 ところで、webminはほとんどのディストリでデフォルトでインストールされる程、重宝する管理ツールですが、一部設定出来ないアプリもあったりします。管理者のIPアドレスが固定なら、それのみで設定出来るようにした方が良いと思います。suduでApacheに権限委譲するよりはこちらの方が安全と思います。sudoで対応させるなら、せいぜい/sbin/squidだけを有効にする程度じゃないでしょうか。

123daa
質問者

お礼

お世話になります。 WEBMINで再起動をかけることができました。 初めて使うツールなんですが、便利ですね。 とはいえ、私の知識は発展途上なので使用は控えます。 visudoはこれからぼちぼちと勉強していきます。 ちなみにviは使用できます。 昔ある超マイナーな言語をたしなんでいたのですが、 その言語のエディタと90%同じなんですよ。 ありがとうございました。

123daa
質問者

補足

お世話になります。ご報告です。 無事PHPから再起動できました。 visudo nobody ALL=NOPASSWD:/usr/local/squid/sbin/squid -k reconfigure php-script system("sudo /usr/local/squid/sbin/squid -k reconfigure") となりました。 ありがとうございました。

  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.5

下の方も書かれてますが、123daaさん( (^^; )のやりたい事はsudoを使えば非常に簡単に実現出来ます。 が、私もなんでそんな事したいの?って思いますよ。 一応sudoに関する質問に答えると、rootでログインし、 visudo ってコマンドをうちます。 すると sudoを編集出来ます。 (下の方が書かれてる通り、sudoersを直接編集してもいいですが、これは敬遠されている方法です。やめた方が無難です。) そこに下記のように、httpユーザー(nobodyと仮定します)が実行したいコマンドを羅列していきます。 nobody ALL = NOPASSWD: /usr/sbin/useradd,/usr/sbin/userdel,/bin/rm,/bin/chmod,/bin/chown,/bin/mkdir,/bin/cp,/usr/bin/pas swd,/sbin/squid (おお…危険な設定(笑)) こうすればブラウザから、ユーザーを追加したり、消したり出来てしまいます… だからやめた方が無難ですけどね(^^;

123daa
質問者

お礼

皆様、本当にありがとうございます。 本番に実装するのは別として、一度やってみます。 危険なことはしないに越したことないし、WEBMINで実現できるならそれでOKですので。 月曜日以降になりますが、結果は報告いたします。

回答No.3

他の方も書いていますが、exec()かsystem()あたりでいけます。但し、apacheに実行権限がなえればいけません。 実行権限を与えるにはsudoを使います。 sudoを使ってApacheに実行権限を与える時注意すべきは実行しているのがapacheなのか、nobodyなのか、それ以外なのか、と言う事です。また、Apacheに実行権限を与えると言う事はかなり大きなセキュリティホールになる可能性もよく考慮して下さい。 追加ですが、cd /usr/local/squidと言うのは有効にはならないのではないかと思います。また、system関数等ではコマンドは絶対パスで記載する必要があります。

123daa
質問者

お礼

ありがとうございます。 実行権限の与え方を勉強しないと、難しいですねぇ。 まだリナックスはやり始めたばかりで、全然わかってないのです。ウィンドウズならある程度はわかるのですが・・ 例えば、ひとつのフォルダにウインドウズなら簡単に、この人は777、このグループは666とか、視覚的にわかるじゃないですか? それが、黒画面になると・・・最近吹き出物が増えましたよ。 cd /usr/local/squidと書くと、そんなんありませんって返ってくるので、フルで書くと、動かないし。 実行権限のところ、勉強します。

  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.2

上手く動かないのは、/sbin/以下のコマンドにたいして、httpのユーザーが実行権を持たないからではないですか? (まあルート専用コマンドなので当たり前ですけど(^^;) sudo でhttpユーザー(何もしてないようでしたら多分nobody)に実行権を与えれば上手く動くと思いますよ。

123daa
質問者

お礼

ありがとうございます。 実行権限の与え方がよくわからないので、sudoで試しました。 exec("sudo ps -ax",$a); でプロセスのリストを出すとこまでいったのですが、 exec("sudo /usr/local/squid/sbin/squid -k shutdown") とすると、実行できませんってでます。 apache2/htdocsにtest.phpとして、ルートでログオンしてphp test.phpで駄目です。 rootでログオンして、cd / の /usr/local/squid/sbin/squid -k shutdown だと 動くのですが。 根本的なところからの知識不足なので、いろいろと調べてるのですが・・・なかなか難しいですね。

  • ken_2004
  • ベストアンサー率25% (1/4)
回答No.1

exec("再起動コマンド"); これで、phpからLinuxにコマンドを実行させるとできると思います。

参考URL:
http://jp2.php.net/manual/ja/function.exec.php
123daa
質問者

お礼

ありがとうございます。 一応試したのですが、上手いこと動きません。 実際には cd /usr/local/squid ./sbin/squid -k shutdown ./sbin/squid とやりたいのですが、このサンプルスクリプトがある URL等はご存知ありませんか? お暇なときで結構ですので・・・ もちろん私も今からもっと色々試してみます。

関連するQ&A