シェルのコマンドをパラメータにして実行するAPIをPHPで

あるコマンドをブラウザ経由で実行したいなと思いました。
セキュリティの観点から、外部公開でこれをやるのは極めて危険だと思いますのでやらないほうが良いでしょう。
ちなみにApacheでPHPを動かす場合、rootにするためにはソースビルドが必要なのでいろいろと面倒です。
PHP5.4系であればルートで php -S localhost:8080 などとすればウェブサーバーが立ち上がり、どんなコマンドも実行し放題になります。Ubuntu 13.04のapt-getからは標準でPHP5.4系になっています。

スペースが必要なコマンド、たとえば ls -all などについても普通に打つだけで問題なく実行されます。(スペースはPOST/GETではアンダーバーに変換されます。そして本プログラムにおいてはアンダーバーをスペースに変換しています。なのでアンダーバーを含んだファイルなどを操作する際はうまくいかないかもです。きちんとエスケープ等頑張れば行けるでしょうけれど面倒なのでやりません)

order.php

<?php
# なんとなく。。。dateコマンドなど打つかもなので。
date_default_timezone_set('Asia/Tokyo');

if (!isset($_GET['order'])) {
	die("There is no orders. Nothing was operated. Please accsess like this: http://127.0.0.1/order.php?=ls");
}

$order = str_replace("_", " ", $_GET["order"]);

$output = shell_exec($order);
echo "<pre>" . $output . "</pre>";
?>

実行方法は、(↑のファイルのあるディレクトリかつPHP5.4以上)
1. サーバーを立ち上げる (PHP5.4以上が必要です)
$ php -S localhost:8080
2. ブラウザで、「http://localhost:8000/order.php?order=ls_-all」などと打つ
3. 実行された結果が表示される (おわり)
です。

Bookmark the permalink.

Comments are closed.