カテゴリ:

サーバの状態を知りたい時、通常はログインして(直接なり、リモートなり)コマンドを打ちますが、コマンドを1つ打つだけのためにログインするのも面倒くさいです。こんな時に便利なのが指定のコマンドを実行して、ブラウザで表示できるCGI。さてどうすればいいのでしょうか。

最近のLinuxであれば /var/www/cgi-bin/ に今から作る cgiスクリプトファイルをおきます。

まず単純にdfコマンドの結果を表示するプログラムを作ってみましょう。

# vi sample_df.cgi
# chmod +x sample_df.cgi
# cat sample_df.cgi
#!/bin/sh

df -h

シェル上で実行すると、問題ありません。

# ./sample_df.cgi
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda8             291M  138M  139M  50% /
/dev/hda1              97M   14M   78M  16% /boot
none                  506M     0  506M   0% /dev/shm
/dev/hda2             4.9G  188M  4.4G   5% /home
/dev/hda6             485M   11M  449M   3% /tmp
/dev/hda3             3.9G  1.3G  2.4G  35% /usr
/dev/hda5             2.9G  1.7G  1.2G  60% /var

ではブラウザから実行してみます(例 http://server/cgi-bin/sample_df.cgi)。するとエラーになります。

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

ブラウザでデータを表示させるにはブラウザに対し、データの内容はこの形式ですよと教えてあげる必要があります。これを指定しないと上記のようにうまく表示できません。今回はただのテキストですので Content-type: text/plain を指定します。CGIを下記のように修正します。

# cat sample_df.cgi
#!/bin/sh

echo "Content-type: text/plain" ←追加
echo ←追加(改行を加えるために必要)
df -h

そしてブラウザで実行すると、正しく表示されました。ということでとりあえず Content-type が必要だということが分かればブラウザで表示することは簡単です。ただこの方法は単純なテキストですので、色の指定など細かい表示設定は出来ません。

重要な点としてこのようなCGIを作り、インターネットに接続されたサーバに置くには注意が必要です。単純なファイル名(df.cgiなど)では推測されやすいため、情報の盗み読みなどに使われる可能性がありますので、自分にしか分からない複雑なファイル名にした方がいいでしょう。当然ながらパスワードが要求されるディレクトリなどに置くほうがより安全です。