将URL作为参数传递给CGI脚本

时间:2013-11-27 00:32:58

标签: bash shell url cgi

我正在使用bash shell,我正在尝试通过一个html页面,通过URL循环传递给我的cgi脚本的每个参数。我不确定在“$ @”中使用i是否正在做我需要的事情。我需要循环遍历URL传递的每个参数。

for site in "$@"
do
p=`links -dump $site`
done

示例网址如下:

cgi/word?http://en.wikipedia.org/wiki/Wienermobile+http://en.wikipedia.org/wiki/Apple

两个网址是我的参数。

我非常擅长在网页和脚本之间使用和使用cig,如果这是一个简单的修复,请原谅。

1 个答案:

答案 0 :(得分:1)

您提供的示例实际上并不是有效的网址,因为它未正确转义(例如,请参阅维基百科的“百分比编码”)

cgi/word?http://en.wikipedia.org/wiki/Wienermobile+http://en.wikipedia.org/wiki/Apple

应该更像是

cgi/word?http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FWienermobile%20http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FApple

HTTP不是一个简单的协议,您可能最好使用框架,而不是在shell中编写(这会增加shell附带的所有陷阱的安全风险)

但只是为了它的乐趣,这是一个shell中的示例CGI脚本,它解码查询字符串。

#!/bin/sh

percentdecode() {
    /usr/bin/printf "$(/usr/bin/printf %s "$1" | sed -e 's/%/\\x/g; s/+/ /g')"
}

qsdecode() (
    IFS=\&
    for kv in $QUERY_STRING ; do
        IFS==
        set -- $kv
        if [ $# -ne 2 ]; then
            echo "Not a valid key-value pair: $kv"
            continue
        fi
        k=$(percentdecode "$1")
        v=$(percentdecode="$2")

        echo "Key: $k"
        echo "Value: $v" 
    done
}


cat <<'EOF'
Status: 200 OK
Content-Type: text/plain; charset=UTF-8

EOF

qsdecode

这解析传输密钥值存储的传统查询字符串格式 ?a=b&c=d&e=f。建议您最好遵循此格式格式。如果你必须使用?value1+value2+value3这样的东西,那么解析非常简单:

decode_plusdelimited() (
    unset IFS
    # percentdecode maps '+' and '%20' to ' '
    for value in $(percentdecode "$QUERY_STRING"); do
        echo "Got value: $value"
    done
)

(请注意,您没有给出加分格式的精确规范,所以这只是一个近似值)