« サーバ間の設定ファイル差異を比較するスクリプト | Main | 古いログを別のディレクトリに自動的に移動する方法 »

October 28, 2010

WEB上からapacheの生ログを見ることができるようにするプログラム

apache生ログをWEB上から見たいという要望を受けて簡単にPHPで作ってみましたのでご紹介致します。突っ込みどころ満載かと思いますが、その場合はコメントに記載いただけましたら幸いです。改善的コメント大歓迎です。

※重大な警告:この手のスクリプトは重大なセキュリティホールを招く場合がありますので、もし実利用される場合は十分ご注意ください。


【プログラムの概要】
今回作成したプログラムでは、特定ディレクトリ内のファイルリストを取得して一覧を出します。そして一覧の中から特定ファイルをクリックするとそのファイルの最後10行(もしくは指定行数)を表示するというものです。例えばこんな感じです。

web1 top>
tail -

access_log 38543
access_log 5435
access_log 23533
error_log 10206
error_log 236
error_log 1256


【プログラム】
これを実現するプログラムは以下の通りです。特に難しいことはやってないので容易に理解できるかと思います。(赤字の部分を直して使ってください)

■logview.php

<?php
$scripturl = "http://www.example.com/admin/logview.php";
$basedir = "/var/log/httpd";

global $f_cmd;
global $f_filename;
$f_numlist = 10;
if (isset($_GET["c"])) $f_cmd = htmlspecialchars(@$_GET["c"], ENT_QUOTES);
if (isset($_GET["f"])) $f_filename = htmlspecialchars(@$_GET["f"], ENT_QUOTES);
if (isset($_GET["n"])) $f_numlist = htmlspecialchars(@$_GET["n"], ENT_QUOTES);

if (strpos($f_filename, "..") !== FALSE) {
     print "You can't use '..'.";
     exit;
}

print `/bin/hostname` . "<a href='$scripturl'>top></a><br />";
?>

<form method="GET" action="viewlog.php">
  <input type="hidden" name="c" value="<?=$f_cmd?>" />
  <input type="hidden" name="f" value="<?=$f_filename?>" />
  tail -<input type="text" name="n" size=3 value="<?=$f_numlist?>" />
  <input type="submit" />
</form>

<pre>
<?php
//--------------------
//ログ一覧表示
//--------------------
if ($f_cmd == "") {
    $lists = `ls -lb  $basedir/*log* |awk '{print $9,$5}'`;
    $arr_lists = split("\n", $lists);
    foreach ($arr_lists as $list) {
        $list = str_replace($basedir."/", "", $list);
        $arr_list = split(" ", $list);
        if ($arr_list[1] != 0) {
            $arr_list_new = str_replace("error", "<font color=red>error</font>", $arr_list[0]);
            print "<a href='$scripturl?c=p&f=$arr_list[0]'>$arr_list_new</a> $arr_list[1]<br />";
        }
    }
}

//--------------------
//ログ表示
//--------------------
if ($f_cmd == "p" && !empty($f_filename)) {
    system("tail -$f_numlist $basedir/$f_filename");
}
?>
</pre>
</html>

|

« サーバ間の設定ファイル差異を比較するスクリプト | Main | 古いログを別のディレクトリに自動的に移動する方法 »

WEBサーバ 【人気】」カテゴリの記事

Comments

こんにちは。

手元のCentOS5.5では、/var/www/httpdの読み込み権限がないので、権限を追加するかログをどこかに移動する必要があるみたいです。

$ ls -la /var/log/ | grep httpd | grep -v grep
drwx------ 2 root root 4096 10月 27 15:45 httpd

Posted by: shinobe | October 28, 2010 at 11:44 AM

もしくは sudo させるか、ですかね?

Posted by: segami | October 28, 2010 at 03:21 PM

OSコマンドインジェクションで、任意のコマンドが実行しほうだいじゃないでしょうか?

Posted by: | October 31, 2010 at 09:37 AM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/32004/49867628

Listed below are links to weblogs that reference WEB上からapacheの生ログを見ることができるようにするプログラム:

» WEB上からapacheの生ログをリアルタイム?で見ることが出来るようにするWEBアプリ [@OMAKASE]
 apache等のwebサーバの生ログ(httpd-access.log)をwe... [Read More]

Tracked on June 02, 2011 at 03:16 PM

« サーバ間の設定ファイル差異を比較するスクリプト | Main | 古いログを別のディレクトリに自動的に移動する方法 »