Bash 如何通过变量将文件夹路径通过CGI传递给脚本?

Bash 如何通过变量将文件夹路径通过CGI传递给脚本?,bash,cgi,Bash,Cgi,我有一个CGIBash脚本,用于调用另一个安装docker容器的bash脚本。我在尝试传递文件夹路径时遇到问题 app install.cgi: #!/bin/sh echo "Content-type: text/html\n" # Collect arguments from the URL APPNAME=`echo "$QUERY_STRING" | sed -n 's/^.*appname=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` APP_W

我有一个CGIBash脚本,用于调用另一个安装docker容器的bash脚本。我在尝试传递文件夹路径时遇到问题

app install.cgi:

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

# Collect arguments from the URL
APPNAME=`echo "$QUERY_STRING" | sed -n 's/^.*appname=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
APP_WEB_PORT=`echo "$QUERY_STRING" | sed -n 's/^.*app_web_port=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
APP_WEB_USER=`echo "$QUERY_STRING" | sed -n 's/^.*app_web_user=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
APP_WEB_PASS=`echo "$QUERY_STRING" | sed -n 's/^.*app_web_pass=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
DOWNLOAD_DIR=`echo "$QUERY_STRING" | sed -n 's/^.*download_dir=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
CONFIG_DIR=`echo "$QUERY_STRING" | sed -n 's/^.*config_dir=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
LIBRARY_DIR=`echo "$QUERY_STRING" | sed -n 's/^.*library_dir=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
DOWNLOAD__TEMP_DIR=`echo "$QUERY_STRING" | sed -n 's/^.*download_temp_dir=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
WORKING_DIR=`echo "$QUERY_STRING" | sed -n 's/^.*working_dir=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`

# Export em

export APPNAME
export APP_WEB_PORT
export APP_WEB_USER
export APP_WEB_PASS
export DOWNLOAD_DIR
export CONFIG_DIR
export LIBRARY_DIR
export DOWNLOAD__TEMP_DIR
export WORKING_DIR

# HTML header
echo "<html>"
echo "<head><title></title></head>"
echo "<body>"

# Run script
if [ $APPNAME ]
then
    echo "Installing $APPNAME..."
    echo "<pre>"
    bash -x /var/www/mysite.local/public_html/lib/$APPNAME/install-$APPNAME.sh
    echo "</pre>"
else
    echo "No app specified, check the error log"
fi

# Close HTML header
echo "</body>"
echo "</html>"
我使用URL调用所有内容(在本例中,我省略了大多数变量,因为似乎只有以“DIR”结尾的变量有问题:

http://mysite.local/cgi-bin/install-app.cgi?appname=foo&config_dir=“\tmp\myapp\config”

我从docker得到以下错误:

http://mysite.local/cgi-bin/install-app.cgi?appname=foo&config_dir=\tmp\myapp\config

我假设我没有正确地转义某些内容,但如何在此处正确传递文件夹名称?

您当前的问题是URL不正确地包含不需要的引号:

QUERY_STRING='http://mysite.local/cgi-bin/install-app.cgi?appname=foo&config_dir=\tmp\myapp\config'

IFS='&' read -ra kvpairs <<< ${QUERY_STRING#*\?}

for kv in "${kvpairs[@]}"; do
  IFS== read -r k v <<< $kv
  case $k in
    appname)           APPNAME=$v ;;
    app_web_port)      APP_WEB_PORT=$v ;;
    app_web_user)      APP_WEB_USER=$v ;;
    app_web_pass)      APP_WEB_PASS=$v ;;
    download_dir)      DOWNLOAD_DIR=$v ;;
    config_dir)        CONFIG_DIR=$v ;;
    library_dir)       LIBRARY_DIR=$v ;;
    download_temp_dir) DOWNLOAD_TEMP_DIR=$v ;;
    working_temp_dir)  WORKING_DIR=$v ;;
  esac
done
在您用更适合解析URL的语言重写此代码之前,我将使用类似的代码(它仍然很脆弱,但比您当前的代码更简单):

QUERY\u STRING='1〕http://mysite.local/cgi-bin/install-app.cgi?appname=foo&config_dir=\tmp\myapp\config'

IFS='&'read-ra kvpairs请不要为此使用
bash
。选择一种已经有用于解析URL的库的语言。我想我必须学习python:(有什么方法可以让它同时工作吗?Perl,也就是说。。。
http://mysite.local/cgi-bin/install-app.cgi?appname=foo&config_dir=\tmp\myapp\config
QUERY_STRING='http://mysite.local/cgi-bin/install-app.cgi?appname=foo&config_dir=\tmp\myapp\config'

IFS='&' read -ra kvpairs <<< ${QUERY_STRING#*\?}

for kv in "${kvpairs[@]}"; do
  IFS== read -r k v <<< $kv
  case $k in
    appname)           APPNAME=$v ;;
    app_web_port)      APP_WEB_PORT=$v ;;
    app_web_user)      APP_WEB_USER=$v ;;
    app_web_pass)      APP_WEB_PASS=$v ;;
    download_dir)      DOWNLOAD_DIR=$v ;;
    config_dir)        CONFIG_DIR=$v ;;
    library_dir)       LIBRARY_DIR=$v ;;
    download_temp_dir) DOWNLOAD_TEMP_DIR=$v ;;
    working_temp_dir)  WORKING_DIR=$v ;;
  esac
done