CGI Web应用程序,难以应对变量

问题描述

这是我在这里的第一篇文章。 很长时间以来,我一直在阅读stackoverflow,我想花一点时间来感谢您为社区做出的一切贡献。谢谢。

由于脚本领域知识不足,因此我撰写了这篇文章。 由于问题的复杂性(我认为),我无法通过谷歌解决方案。 首先-我非常感谢任何相关的材料链接能够自己学习。 如果我想做什么,有什么现代的解决方案-我宁愿从bash \ cgi \ PHP切换到它,因为我不太了解。

我有一个Apache 2.4,即时通讯正在尝试创建Web应用程序。 现在它具有bash语法,但是稍后我将在弄清楚如何构建有效的bash脚本时将其转换为CGI。 它确实:

#!/bin/bash

echo "Content-type: text/html"
echo ""

sv00dbtest01=$(5d0b3f1b-16f4-4d6a-8fac-0e746887f71d)
sv00dbtest02=$(010eeaea-f56b-42b3-b4e4-26ef235860a9)
sv00dbtest03=$(0688e718-c807-4629-ab90-1cc729fd1513)
sv00dbtest04=$(4e9bf96b-3311-4936-a877-4e66ca3a860a)
sv00dbtest05=$(fce66f7a-2a50-4856-978c-cbe44dd2acb6)
sv00dbtest06=$(271476de-97d0-4915-895c-98da9be2d6d2)
sv00dbtest07=$(9c5a7112-1685-4a0e-9d07-30669383ec12)
sv00dbtest08=$(f7a7f06a-adcb-4eda-8f68-3a2d7874ff86)
sv00dbtest09=$(5d1f2088-5148-4ec7-b169-8e674dd6ba40)
sv00dbtest10=$(fc4ad441-a997-4a28-888e-97e53e965447)
file=$(ssh -p 48563 root@$srv1 'ls -1t /app/docker/pg/backup/daily | head -n 1')

echo '<html>'
echo '<head>'
echo '<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
echo '<title>Form Example</title>'
echo '</head>'
echo '<body>'

  echo "<form method=GET action=\"${SCRIPT}\">"\
       '<table Nowrap>'\
          '<tr><td>Input</TD><TD><input type="text" name="srv1" size=12></td></tr>'\
          '<tr><td>Section</td><td><input type="text" name="srv_list" size=12 value=""></td>'\
          '</tr></table>'

  echo '<input type="radio" name="srv2" value="sv00dbtest01" checked> Test server №1<br>'\
       '<input type="radio" name="srv2" value="sv00dbtest02"> Test server №2<br>'\
       '<input type="radio" name="srv2" value="sv00dbtest03"> Test server №3'
       '<input type="radio" name="srv2" value="sv00dbtest04"> Test server №4'
       '<input type="radio" name="srv2" value="sv00dbtest05"> Test server №5'
       '<input type="radio" name="srv2" value="sv00dbtest06"> Test server №6'
       '<input type="radio" name="srv2" value="sv00dbtest07"> Test server №7'
       '<input type="radio" name="srv2" value="sv00dbtest08"> Test server №8'
       '<input type="radio" name="srv2" value="sv00dbtest09"> Test server №9'
       '<input type="radio" name="srv2" value="sv00dbtest10"> Test server №10'

  echo '<br><input type="submit" value="Process Form">'\
       '<input type="reset" value="Reset"></form>'

    scp -3 -P 48563 root@$srv1:/app/docker/pg/backup/daily/$file root@$srv2:/app/docker/pg/backup/$file
    ssh -p 48563 root@$srv2 "systemctl stop docker-compose"
    ssh -p 48563 root@$srv2 "rm -Rfv /app/docker/pg/data"
    ssh -p 48563 root@$srv2 "tar -zsxvf /app/docker/pg/backup/$file --strip=3 -C /app/docker/pg/"
    ssh -p 48563 root@$srv2 "chown -R 1000:1000 /app/docker/pg/data"
    ssh -p 48563 root@$srv2 "systemctl start docker-compose"
    ssh -p 48563 root@$srv2 "rm -Rfv /app/docker/pg/backup/$file"
    ssh -p 48563 root@sv00apptest01 "docker exec server1c /opt/1C/v8.3/x86_64/rac infobase update --cluster=7f122b3b-799c-4c98-a98f-4953a78eff48 --infobase=$srv_list --infobase-user=123 --infobase-pwd=123 --db-server=$srv1"

  if [ "$REQUEST_METHOD" != "GET" ]; then
        echo "<hr>Script Error:"\
             "<br>Usage error,cannot complete request,REQUEST_METHOD!=GET."\
             "<br>Check your FORM declaration and be sure to use METHOD=\"GET\".<hr>"
        exit 1
  fi

  # If no search arguments,exit gracefully Now.

  if [ -z "$QUERY_STRING" ]; then
        exit 0
  else
     # No looping this time,just extract the data you are looking for with sed:
     srv1=`echo "$QUERY_STRING" | sed -n 's/^.*srv1=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
     srv2=`echo "$QUERY_STRING" | sed -n 's/^.*srv2=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
     srv_list=`echo "$QUERY_STRING" | sed -n 's/^.*srv_list=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
     echo "Restored base: " $XX
     echo '<br>'
     echo "On the server: " $YY

  fi
echo '</body>'
echo '</html>'

exit 0

所以问题是我无法弄清楚如何使用创建的变量池并将它们分配给另一个变量$ srv_list。这样,当用户在Web表单中输入文本时,脚本仅对变量的值做出反应。 另一个问题是创建Web表单,其中对于变量$ srv1和$ srv2,输入的文本进入脚本并执行。当人们从Web窗体应用程序输入文本时,变量将评估为脚本并执行它。 我正在阅读此帖子atm http://www.yolinux.com/TUTORIALS/BashShellCgi.html 并尝试创建类似的东西。 预先感谢。

解决方法

创建一个数组而不是一次创建每个变量:

srv_list=(
    "5d0b3f1b-16f4-4d6a-8fac-0e746887f71d"
    "010eeaea-f56b-42b3-b4e4-26ef235860a9"
    "0688e718-c807-4629-ab90-1cc729fd1513"
    "4e9bf96b-3311-4936-a877-4e66ca3a860a"
    "fce66f7a-2a50-4856-978c-cbe44dd2acb6"
    "271476de-97d0-4915-895c-98da9be2d6d2"
    "9c5a7112-1685-4a0e-9d07-30669383ec12"
    "f7a7f06a-adcb-4eda-8f68-3a2d7874ff86"
    "5d1f2088-5148-4ec7-b169-8e674dd6ba40"
    "fc4ad441-a997-4a28-888e-97e53e965447"
)

要处理此列表,您可以使用for遍历数组:

for i in ${srv_list[@]}; do
        ssh -p 48563 root@sv00apptest01 "docker exec server1c /opt/1C/v8.3/x86_64/rac infobase update --cluster=7f122b3b-799c-4c98-a98f-4953a78eff48 --infobase=${i} --infobase-user=123 --infobase-pwd=123 --db-server=$srv1"
done

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...