2017-05-24 120 views
0

我有一個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 

我假設我不會逃避正確的東西,但我怎麼能正確地路過這裏的一個文件夾的名字嗎?

+0

請不要使用'bash'。選擇一個已經有解析URL的庫的語言。 – chepner

+0

我想我將不得不學習python :(以任何方式讓它在此期間工作? – Moses

+0

Perl,那是... – Moses

回答

1

你眼前的問題是,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 
相關問題