如何将文件夹路径通过CGI传递给脚本通过变量?
问题描述:
我有一个CGI bash脚本,用于调用另一个安装Docker容器的bash脚本。尝试传递文件夹路径时遇到问题。如何将文件夹路径通过CGI传递给脚本通过变量?
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>"
install-myapp.sh
#!/bin/sh
# Install docker container from vars
sudo docker create \
--name=myapp \
-v $CONFIG_DIR:/config \
-v $DOWNLOAD_DIR:/downloads \
-v $LIBRARY_DIR:/library \
-e PGID=$PGID -e PUID=$PUID \
-e TZ=$TZ \
-p $APP_WEB_PORT \
docker/imagepath
我打电话了一切使用URL(我省略了大部分的变量在这种情况下,因为它似乎只有“DIR”结束瓦尔似乎有问题:
http://mysite.local/cgi-bin/install-app.cgi?appname=foo&config_dir="\tmp\myapp\config"
我从泊坞窗出现以下错误:
Error response from daemon: create %22/tmp/myapp/config%22: "%22/tmp/myapp/config%22" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed
我假设我不会逃避正确的东西,但我怎么能正确地路过这里的一个文件夹的名字吗?
答
你眼前的问题是,URL正确包含不需要的报价:
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
请不要使用'bash'。选择一个已经有解析URL的库的语言。 – chepner
我想我将不得不学习python :(以任何方式让它在此期间工作? – Moses
Perl,那是... – Moses