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コマンドで変換しているという訳です。
- シェルスクリプトのexpectで応答メッセージを振り分ける方法
- bashでPostgreSQLのselect結果を出力する方法
- bashでbackspaceが動作しない場合の対処
- bashの変数から最後の1文字を取得・削除する方法
- bashのwhile文で利用した変数がループ外で反映されない場合の対処
- bashのechoでアスタリスク「*」がワイルドカードとして展開される場合の対処
- bashの正規表現でスペース(空白)を判定する方法
- bashで文字列の長さを調べる方法
- bashで数値を判定する方法
- bashで小数点を比較する方法
- bashの配列をjoinする方法
- bashのif文で正規表現を使用する方法
- Bashで変数を大文字または小文字に変換する方法
- bashの変数をsplitして配列を作る方法
- シェルスクリプトでtelnet接続する方法