perlでHTMLから呼ばれるCGIを使うときは、下記のようなひな形を使ってきた。methodがPUTでもGETでも有効となるようだ。
#!/usr/bin/perl
$request_method = $ENV{‘REQUEST_METHOD’};
if ($request_method eq “GET”) {
@args = split(/&/,$ENV{‘QUERY_STRING’});
} else {
read(STDIN,$buffer,$ENV{‘CONTENT_LENGTH’});
@args = split(/&/,$buffer);
}
foreach $arg (@args) {
($name, $value) = split(/=/,$arg);
$name =~ s/\n//g;
$form{$name} = $value;
}
$request_method = $ENV{‘REQUEST_METHOD’};
で、GETかPUTを判断。
GETだったら
$ENV{‘QUERY_STRING’}
を区切り文字”&”で区切って、配列変数@argsに格納。
PUTだったら
STDINから$ENV{‘CONTENT_LENGTH’}文字をreadする、
という手順。
まぁ、ちょっと冗長な感じもする。
今回のHTMLではSubmitボタンを押したときに、HTMLからCGIに変数が渡されるので、REQUEST_METHODはGETで決め打ちして良い予感。
という前提のもとに、シェルスクリプト(#!/bin/sh)を書いてみる。
題目の答えとしては「read 変数」とすれば、取得できる。
#!/bin/sh
################################################## htmlから変数を受け取る
# read PARAM にて ${PARAM}にフォームに入力したデータを取得する
################################################## requestmethod=$ENV <- $ENVはつねにGETであった
read PARAM
# hostname=localhost&username=user&password=CurrentPassword&newpw1=NewPassword&newpw2=NewPassword <-${PARAM}の例
#パラメータ名=の部分をsedで整形する
HOSTNAME=`echo ${PARAM}|awk -F “&” ‘{print $1}’|sed -e ‘s/hostname=//’`
USERNAME=`echo ${PARAM}|awk -F “&” ‘{print $2}’|sed -e ‘s/username=//’`
PASSWORD=`echo ${PASSWORD}|awk -F “&” ‘{print $3}’|sed -e ‘s/password=//’`
NEWPWA=`echo ${PARAM}|awk -F “&” ‘{print $4}’|sed -e ‘s/newpw1=//’`
NEWPWB=`echo ${PARAM}|awk -F “&” ‘{print $5}’|sed -e ‘s/newpw2=//’`#localhost以外にはご遠慮いただく(おまじない)要らんかな?
if [ ${HOSTNAME} != “localhost” ] ; then
echo “Cannot execute from REMOTE-HOST !! <BR>”
echo “</body></html>\n”
exit 0
fiexit 0
てな感じでperlを持ち出すまでもなく、/bin/shでHTMLから変数を受け取れた。