TopProgramming Languagebash > 2014年4月
2014年4月11日

bashでCGIを実行する

April 11,2014 1:55 AM
Tag:[, ]
Permalink

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コマンドで変換しているという訳です。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3