サーバーでコマンドを使用したくなる時があります。自分が使用したくなるケースとして、例えば以下のような場合。
- cronの実行ファイルを試験的に実行したい
- サーバー側でzip,unzipしたい(展開してからFTPすると時間がかかるので)
しかし、契約内容あるいはサーバー側のサービスによってコマンドラインが使用できない場合がある。そこで、簡易的にコマンドを実行できるPHPを記載してみました。使用には若干癖がありますが、ご容赦の程。
プログラムの構造
本プログラムはこの前に投稿した以下が基本となっています。
下記構造において()内のファイルは同一であるので、上記投稿を参照してください。
|
1 2 3 4 5 6 7 8 9 10 11 |
/root | +--tools/ いくつかのツールを置いています | +--(index.php) loginを促すページです | +--success.php loginに成功し、どこを修正するかを促すページです | +--(logout.php) logout後のページです | +--doexec.php コマンドを実行するページです | +--(sessconf.php) セッションに入っているか確認するPHPで、 | セッション中に使用するPHPすべてからrequireします +--o_tools/ 外部から直接見られたくないファイル +--(un_pw.php) ユーザー名とパスワードの入ったファイルです |
では、早速プログラムの説明に入ります。
tools下
login後のsuccess.phpを以下に掲載する。参考にしたプログラムとほとんど変更はないんですが、コマンドを実行するphpとして、herfでdoexec.phpを呼び出すよう変更しております。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php //セッションの処理 require('./sessconf.php'); //ログインされている場合は表示用メッセージを編集 //$message = $_SESSION["login_id"] . "さん、ログインしました”; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ログインページ</title> <link href="style.css" rel="stylesheet" type="text/css"> </head> <body> <h1>ログインページ</h1> <h2>コマンド実行画面へは以下から進んでください</h2> <a href="./doexec.php">コマンド実行画面に進む</a><br> <h2>ログアウトは以下から進んでください</h2> <a href="logout.php">ログアウト</a> </body> </html> |
次にメインとなるコマンドを実行するPHPであるdoexec.phpです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
<?php //セッションの処理 require('./sessconf.php'); //PHPのPATH設定 $phppath = "export PATH=\$PATH:(phpのパス)" ; //logファイル名 $logfile = "log.txt"; //リロード対策も含めて毎回実施する $command = ""; $cmdrireki = ""; $nokosu = ""; $nokosanai = ""; $execcmd1 = "rm " . $logfile; $execcmd2 = "touch " . $logfile; if(file_exists($logfile)){ exec($execcmd1); //ファイルの削除 exec($execcmd2); //空ファイルの作成 } //ポストされたらのコマンドを処理 if (isset($_POST['message']) && is_string($_POST['message'])) { $command = "( " . $phppath . " ; " . $_POST['message'] . " ) > ". $logfile ." 2>&1"; if ($_POST['rireki'] == "残す"){ $cmdrireki = $_POST['message']; $nokosu = 'checked="checked"'; $nokosanai = ""; } else if ($_POST['rireki'] == "残さない"){ $cmdrireki = ""; $nokosu = ""; $nokosanai = 'checked="checked"'; } exec($command); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>sample</title> <link href="style.css" rel="stylesheet" type="text/css"> </head> <body> <form action="doexec.php" method="POST"> <p>コマンドを入力してください:<br> <input type="text" name="message" size="100" maxlength="200" value="<?php echo $cmdrireki ?>"> <p>履歴 <input type="radio" name="rireki" value="残す" <?php echo $nokosu ?> >残す <input type="radio" name="rireki" value="残さない" <?php echo $nokosanai ?> >残さない </p> <p><input type="submit" value="実行"></p> </form> <hr> <p>実行コマンド</p> <?php echo $cmdrireki; ?> <hr> <object data="log.txt" width=1200 height=600 type="text/plain"></object> <hr> <br> <a href="./success.php">ログインページへ</a> </body> </html> |
いくつかポイントを記載しておきます。
|
1 2 3 |
<?php phpinfo(); ?> |
(2)アップロードする
(3)アップロードしたphpinfo.phpファイルをhttp経由でアクセスする。
すると、php関連の情報が色々と出てきます。そして、下記部分を参考とし、右セルの etc を bin に書き換えてpathに加えています。
| Configuration File (php.ini) Path | /usr/local/php/(phpのバージョン)/etc |
コマンドの実行
index.phpをアクセスして、un_pw.phpで設定したユーザー名とパスワードを入力すると以下のような画面が出てくるので、赤矢印の「コマンド実行画面に進む」をクリック。

コマンド実行画面は以下。「コマンドを入力してください」の下のBOXにコマンドを入力。履歴は残すのか残さないのかどちらかをクリック。

下の図が ls ––help を実行した際の画面となる。実行コマンドと、その下に実行結果が表示されるる。

実行結果は下部に出てくるが、続けてBOXにコマンドを打ち込めば、再度コマンドが実行されることになります。
ところで、留意点がいくつかあります。まずは cd です。カレントディレクトリ(実行しているディレクトリあるいはフォルダ)を記憶しておりません。あくまで、doexec.phpを配置したフォルダが毎回基本となります。そこで、例えば一つ上でコマンド ls を実行したいとすれば、
と一度に2つのコマンドを打つことになります。
それと、cd だがルートを経由するとNGになるようです。例えば doexec.php が /abc/ にあり、 /def で ls のコマンドを実行したいとすると以下はNGとなり、実行できな旨の表示がなされます。
これは一度ルートのさらに一階層上(=アクセス許可がない)にまでアクセスが必要だから考えられます。以下のようにして、アクセスすると問題なく実行できます。
もう一つ、phpのファイルを実行するときは、以下のようにphpを先頭に付けて実施してください。
これで、phpファイルが実行されます。
コマンド実行の説明は以上になります。終わるときは、実行画面最下部の「ログインページへ」を押して、「ログアウト」すればおしまいとなりす。
最後に
ここまで読んでいただいてありがとうございました。実装に少し時間がかかるかもしれないが、一度実装しておけば、今後の作業が楽になるのではと思います。使用していただければ幸いです。



