PHPを使ってサーバー上で任意のコマンドを実行して結果を出力する
SSHで接続できないレンタルサーバー上で、とあるコマンドが使えるかどうかを調べたかった。
そのコマンドは、サーバー仕様には書いてないものでした。PHPからコマンドを実行できることを思い出したので、無理やり叩いて確かめてみました。
下記のコードを書いたPHPファイルをサーバーにアップロードしてアクセスすると、入力欄と実行ボタンだけのページが表示されます。入力欄にコマンド入力してボタンを押すと、PHPの passthru()
で実行した結果がページ下部に出力されます。
Warning
誰でもアクセスできるところには絶対に置かないでください。
<?php
$output = '';
if (isset($_POST['cmd']) && $_POST['cmd'] != '') {
ob_start();
passthru($_POST['cmd']);
$output = ob_get_clean();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>ターミナルごっこ</title>
</head>
<body>
<form action="" method="POST">
cmd: <input style="width:30em;" type="text" name="cmd" /><input type="submit" value="exec" />
</form>
<pre>
<?php echo htmlspecialchars($output); ?>
</pre>
</body>
例えば php --version
を実行した結果は次のようになります。
PHPには外部プログラムを実行できる関数がいくつかあるけど、passthru()
は exec()
と system()
とは違って、結果を変形しないでそのまま出してくれるらしいです。結果が戻り値じゃなくて標準出力に吐かれるので、ここでは出力バッファを使って回収してます。
でも、サーバー側の設定でコマンド実行系の関数を使えないようにされてたら、この方法はムリです。できたとしても、あんまり変なことしないように。