bashでCGIを実行する

bashでCGIを実行する

Posted at April 11,2014 1:55 AM
Tag:[bash, CGI]

bashでCGIを実行する方法を紹介します。

1.はじめに

LinuxサーバでCGIを実行する場合、PHP・Ruby・Java・Perlなどのプログラミング言語の利用が一般的と思いますが、bashでもCGIを実行できるかいろいろ調べてみました。

ということで、簡単なCGIの作成からクエリーの分析、URIデコードまでまとめて紹介します。

実際に利用する機会は少ないかもしれませんが、CGIの仕組みを知る上で役立つかもしれません。

2.簡単なCGI

ブラウザからCGIにアクセスしてHTMLを表示する簡単なCGIから説明します。

test.cgiというファイル名で以下の内容を記述します。

#!/bin/sh
 
echo "Content-Type: text/html"
echo ""
echo "<!doctype html>"
echo "<html><head><title>test</title></head>"
echo "<body>"
echo "test"
echo "</body>"
echo "</html>"

保存したファイルを775や705などパーミッションを変更し、ブラウザからアクセスすれば「test」と表示されます。

出力する最初の2行を以下にすることでCGIとして機能します。

echo "Content-Type: text/html"
echo ""

ヒアドキュメントを利用すれば、次のようにまとめて書くこともできます。

#!/bin/sh
 
cat <<EOF
Content-Type: text/html
 
<html><head><title>test</title></head>
<body>
test
</body>
</html>
EOF

上記のソースコードをコピーして試す場合は5行目の半角スペースを削除してください(そのままペーストするとInternal Server Errorが発生します。以下同様)。

3.クエリーを受信する

2項のCGIではクエリーを受信できません。

クエリーを受信するには、${QUERY_STRING}を利用します。

#!/bin/sh
 
cat <<EOF1
Content-Type: text/html
 
<html><head><title>test</title></head>
<body>
EOF1
cat ${QUERY_STRING}
cat <<EOF2
</body>
</html>
EOF2

アクセスするURLを

http://user-domain/test.cgi?foo=bar

とすれば、「cat ${QUERY_STRING}」で

foo=bar

が表示されます。

4.クエリーを分析する

さらに、3項で受信した${QUERY_STRING}を分析するには、例えば以下のようにします。

#!/bin/sh
 
cat <<EOF1
Content-Type: text/html
 
<html><head><title>test</title></head>
<body>
EOF1
 
key=`echo "${QUERY_STRING}" | sed -e "s/\(.*\)=.*/\1/"`
value=`echo "${QUERY_STRING}" | sed -e "s/.*=\(.*\)/\1/"`
echo "key:" ${key} " value:" ${value}
 
cat <<EOF2
</body>
</html>
EOF2

1行目と2行目でクエリーを「=」で分割したキーと値を取得し、変数に保存しています。ここではクエリーパラメータが1つだけであることを想定しています。

key=`echo "${QUERY_STRING}" | sed -e "s/\(.*\)=.*/\1/"`
value=`echo "${QUERY_STRING}" | sed -e "s/.*=\(.*\)/\1/"`

正規表現を使った変数保存方法の詳細については「bashで変数を正規表現で置換して変数に代入する方法」を参照ください。

そして、さきほどのURL「http://user-domain/test.cgi?foo=bar」でアクセスすれば、画面に

key: foo value: bar

が表示されます。

5.クエリーをURIデコードする

さらに、4項で受信したクエリーをURIデコードするには、以下のようtrとnkfを組み合わせます。

#!/bin/sh
 
cat <<EOF1
Content-Type: text/html
 
<html><head><title>test</title></head>
<body>
EOF1
 
key=`echo "${QUERY_STRING}" | sed -e "s/\(.*\)=.*/\1/"`
value=`echo "${QUERY_STRING}" | sed -e "s/.*=\(.*\)/\1/"`
echo "key:" ${key} " value:" ${value} | tr '%' '=' | nkf -WwmQ
 
cat <<EOF2
</body>
</html>
EOF2

やや乱暴なスクリプトですが、まずtrコマンドで出力データ(クエリー)に含まれる「%」を「=」に変換します。

tr '%' '='

そしてnkfコマンドでURIデコードします。

nkf -WwmQ

通常、「テスト」という文字をUTFでURIエンコードすると「%E3%83%86%E3%82%B9%E3%83%88」となりますが、nkfでデコードする場合はURIエンコードされたデータが「=E3=83=86=E3=82=B9=E3=83=88」となっている必要があるため、trコマンドで変換しているという訳です。

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)