PHPにはexecというものがあります。
他にもsystemとかもありますが、直接コマンドを叩くときに使います。
要はこれを使えば何でもやり放題になるわけですが実際にはセキュリティー上の問題が出てくるのでやり放題ではありません。
ls とか date とかそういった無難なコマンドしか叩けません。
ネットワークをOFFにされたり勝手に再起動とかされたら困りますから。
でもPHP上からでもそれを行う方法があります。
一歩間違えるとセキュリティ上とても危ういことになりますが、どうしてもPHP上からいろんなコマンドを叩きたい人は参考にしてください。
(以下はCentOS5系と6系で出来ることを確認してますが、sudo自体はたいていのLinuxには入ってるのでだいたいいけるんじゃないかと思います)
例えばPHPからdateコマンドを叩くと
$system_date = exec('date');
結果:Fri Apr 12 11:56:46 JST 2013
こんな感じになります。
しかしdateコマンドには時刻の変更機能もあります。
時刻の変更は「date 041215402013」とすることで2013年4月12日15時40分に設定することが出来ます。
しかし、これを実行すると
/bin/date: cannot set date: Operation not permitted
こんな感じのエラーが出ます。
要はおめ~にそんな権限はね~ぞと言われているわけです。
どうやって言う事を聞かせるかというと、「sudo」というものの設定を変更することで
やりたい放題にすることが出来ます。
sudoというのはLinux上でユーザーがどんな権限で何を実行できるかを制御してるもんです。
ますコンソールで
[root@localhost ~]# visudo
と入力して実行します。
そうすると自動的にsudoの設定ファイルがviで開かれます。
ここでやることは2つあります。
まず1つ目は
Defaults requiretty
と記載された行をコメントアウトします。
#Defaults requiretty
こんな風に変えます。
これはttyっていう端末でアクセスしてるヤツが操作できるぜ~的な意味があります。
なのでそんなもの持ってなくても出来るようにコメントアウトしてttyとか関係なく操作できるようにしています。
次に実行できるユーザーと範囲を追記してやります。
apache ALL=(ALL) NOPASSWD: ALL
こうすることでPHPからでもdateコマンドで時刻を変更出来る。
NTPのON/OFFも出来るようになります。
でも見て推測できると思うけど「NOPASSWD: ALL」と書いてあるのでこれはapacheさんが何でも出来る状態になってます。
さすがにこれでは危険極まりないので特定のコマンドだけapacheさんが好き放題出来るように変更してみます。
apache ALL=(ALL) NOPASSWD: /bin/date
こうすることでdateコマンドだけ実行を許可することが出来ます。
許可したいコマンドを並べていけばPHPで特定のコマンドだけ許可することが出来ます。
とは言っても正確には「apache」に許可を出している形になるのでセキュリティには十分に気を付けてください。
PHP