gpt4 book ai didi

linux - 带 CGI 的 Shell 脚本适用于 bash 但不适用于 sh

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:59:39 27 4
gpt4 key购买 nike

我发现了以下使用 bash 的 CGI 工作示例。如果我将前两行更改为

#!/bin/sh
echo "Content-type: text/html\n\n"

以下脚本停止工作,当我在浏览器中浏览脚本时,脚本底部声明的“foo”、“bar”和“foobar”消失了。

知道如何使相同的示例与 sh 一起使用。实际上,我需要在没有 bash 但有 sh 的嵌入式设备上运行这样的示例。

#!/bin/bash
echo -e "Content-type: text/html\n\n"
echo "
<html>
<body>
<form action="http://${HTTP_HOST}:${SERVER_PORT}${SCRIPT_NAME}?foo=1234" method="POST">
<input type="text" name="bar">
<textarea name="foobar"></textarea>
<input type="submit">
</form>"


# (internal) routine to store POST data
cgi_get_POST_vars()
{
# check content type
# FIXME: not sure if we could handle uploads with this..
[ "${CONTENT_TYPE}" != "application/x-www-form-urlencoded" ] && \
echo "Warning: you should probably use MIME type "\
"application/x-www-form-urlencoded!" 1>&2
# save POST variables (only first time this is called)
[ -z "$QUERY_STRING_POST" \
-a "$REQUEST_METHOD" = "POST" -a ! -z "$CONTENT_LENGTH" ] && \
read -n $CONTENT_LENGTH QUERY_STRING_POST
return
}

# (internal) routine to decode urlencoded strings
cgi_decodevar()
{
[ $# -ne 1 ] && return
local v t h
# replace all + with whitespace and append %%
t="${1//+/ }%%"
while [ ${#t} -gt 0 -a "${t}" != "%" ]; do
v="${v}${t%%\%*}" # digest up to the first %
t="${t#*%}" # remove digested part
# decode if there is anything to decode and if not at end of string
if [ ${#t} -gt 0 -a "${t}" != "%" ]; then
h=${t:0:2} # save first two chars
t="${t:2}" # remove these
v="${v}"`echo -e \\\\x${h}` # convert hex to special char
fi
done
# return decoded string
echo "${v}"
return
}

# routine to get variables from http requests
# usage: cgi_getvars method varname1 [.. varnameN]
# method is either GET or POST or BOTH
# the magic varible name ALL gets everything
cgi_getvars()
{
[ $# -lt 2 ] && return
local q p k v s
# get query
case $1 in
GET)
[ ! -z "${QUERY_STRING}" ] && q="${QUERY_STRING}&"
;;
POST)
cgi_get_POST_vars
[ ! -z "${QUERY_STRING_POST}" ] && q="${QUERY_STRING_POST}&"
;;
BOTH)
[ ! -z "${QUERY_STRING}" ] && q="${QUERY_STRING}&"
cgi_get_POST_vars
[ ! -z "${QUERY_STRING_POST}" ] && q="${q}${QUERY_STRING_POST}&"
;;
esac
shift
s=" $* "
# parse the query data
while [ ! -z "$q" ]; do
p="${q%%&*}" # get first part of query string
k="${p%%=*}" # get the key (variable name) from it
v="${p#*=}" # get the value from it
q="${q#$p&*}" # strip first part from query string
# decode and evaluate var if requested
[ "$1" = "ALL" -o "${s/ $k /}" != "$s" ] && \
eval "$k=\"`cgi_decodevar \"$v\"`\""
done
return
}



# register all GET and POST variables
cgi_getvars BOTH ALL

echo "<pre>foo=$foo</pre>"
echo "<pre>bar=$bar</pre>"
echo "<pre>foobar=$foobar</pre>"

echo "</body>
</html>"

更新 1:sh -x script 返回以下内容:

+ echo Content-type: text/html\n\n
Content-type: text/html


+ echo
<html>
<body>
<form action=http://:?foo=1234 method=POST>
<input type=text name=bar>
<textarea name=foobar></textarea>
<input type=submit>
</form>

<html>
<body>
<form action=http://:?foo=1234 method=POST>
<input type=text name=bar>
<textarea name=foobar></textarea>
<input type=submit>
</form>
+ cgi_getvars BOTH ALL
+ [ 2 -lt 2 ]
+ local q p k v s
+ [ ! -z ]
+ cgi_get_POST_vars
+ [ != application/x-www-form-urlencoded ]
+ echo Warning: you should probably use MIME type application/x-www-form-urlencoded!
Warning: you should probably use MIME type application/x-www-form-urlencoded!
+ [ -z -a = POST -a ! -z ]
+ return
+ [ ! -z ]
+ shift
+ s= ALL
+ [ ! -z ]
+ return
+ echo <pre>foo=</pre>
<pre>foo=</pre>
+ echo <pre>bar=</pre>
<pre>bar=</pre>
+ echo <pre>foobar=</pre>
<pre>foobar=</pre>
+ echo </body>
</html>
</body>
</html>

最佳答案

与 POSIX 规范相比,Bash 有很多扩展,您的脚本正在使用其中的一些。您的 /bin/sh 显然不是 bash(可能是 ash、dash、mksh 或其他东西)并且没有这些扩展。您必须检查脚本并根据 sh 或 POSIX specification 的文档检查每个构造。 .

快速查找:

  • function cgi_get_POST_vars():function 关键字不应该存在,大括号应该在同一行。
  • read -n $CONTENT_LENGTH QUERY_STRING_POST:read(shell 内置)在 POSIX 中没有 -n 选项。
  • t="${1//+/}%%", h=${t:0:2}:Bourne 不支持其中任何一个修饰语。

但可能还有更多。

编辑:

  • echo 是 shell 之间最不兼容的命令。该标准只是说 \ 的行为是实现定义的。您必须改用 printf

关于linux - 带 CGI 的 Shell 脚本适用于 bash 但不适用于 sh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8969008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com